在实体上实现自定义非映射属性

时间:2012-03-06 10:11:01

标签: entity-framework mapping t4

我目前正在开发一个使用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);
    }
}

1 个答案:

答案 0 :(得分:1)

我终于找到了错误。这个问题在我的属性设置器中撒谎。我应该拨打ReportPropertyChanged/ing

,而不是拨打OnPropertyChanged/ing

ReportPropertyChanged/ing意味着上下文搜索原始实体值和当前实体值之间的变化,但由于此属性只是一个没有映射到商店的状态对象,原始值的概念没有意义,从而使上下文无法为此属性找到正确的映射。

使用OnPropertyChanged/ing修复它。