【发布时间】:2012-03-06 10:11:01
【问题描述】:
我目前正在开发一个使用实体框架模型设计器构建对象模型和持久层的应用程序。
我的要求之一是向我的实体提供一个状态,当它们处于“脏”状态(已修改)时、状态发生变化时以及最重要的是在断开连接模式下工作时,我可以通知我.所以我开始修改 T4 模板,在生成这些实体时添加一个 IsDirty 布尔属性,添加一个在 IsDirty 更改时触发的事件,并在所有标量属性的 xxxChanged 方法中添加 this.IsDirty = true。
当实体未附加到其上下文时一切正常,但在附加时,每当更改属性时,将 IsDirty 值更改为 false,我收到此异常:
属性“IsDirty”没有有效的实体映射 实体对象。有关详细信息,请参阅实体框架 文档。
那么我在这里做错了什么?我不希望将此属性映射到我的数据库中,因为它只是一个对象状态,仅在对象“活动”时才重要。我应该使用一个属性来装饰IsDirty 属性吗?还是我应该派生 EntityObject 并实现状态机制?或者您对如何实现这一点有更好的建议?
谢谢。
编辑:我正在使用带有 EDM 设计器的 Entity Framework 4.0。
这是每个基础实体中生成的代码:
private bool isDirty;
public event EventHandler DirtyStatusChanged;
public bool IsDirty
{
get
{
return this.isDirty;
}
internal set
{
if (this.isDirty != value)
{
ReportPropertyChanging("IsDirty");
this.isDirty = value;
ReportPropertyChanged("IsDirty");
ReportDirtyStatusChanged();
}
}
}
protected void ReportDirtyStatusChanged()
{
var handler = this.DirtyStatusChanged;
if(handler != null)
{
handler(this, EventArgs.Empty);
}
}
【问题讨论】:
-
stackoverflow.com/questions/3595404/… 可能重复,尝试使用 [NotMapped]
-
我认为 NotMapped 仅适用于 Code First。我在这里通过 EDM 设计器使用 Model First。
-
我很确定你正在修改 T4 并且可以访问它应该工作的生成实体(显然是 EF4.1+),你可以试一试,否则你会忽略一些东西,从我认为的模型视图。
-
这应该没有任何问题。您究竟是如何将属性添加到 T4 模板的。你有没有用任何属性标记它?
-
@Luke:是的,这就是我正在做的,只是简单地在代码生成中添加一个支持字段和一个带有内部集的属性访问器。
标签: entity-framework mapping t4