我目前正在开发一个使用Entity Framework模型设计器构建对象模型和持久层的应用程序。
我的一个要求是为我的实体提供一个状态,当状态发生变化时,当他们处于“脏”状态(已修改)时可以通知我,最重要的是,在断开模式下工作。所以我开始修改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);
}
}
答案 0 :(得分:1)
我终于找到了错误。这个问题在我的属性设置器中撒谎。我应该拨打ReportPropertyChanged/ing
。
OnPropertyChanged/ing
ReportPropertyChanged/ing
意味着上下文搜索原始实体值和当前实体值之间的变化,但由于此属性只是一个没有映射到商店的状态对象,原始值的概念没有意义,从而使上下文无法为此属性找到正确的映射。
使用OnPropertyChanged/ing
修复它。