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

Entity framework 在实体上实现自定义非映射属性,entity-framework,mapping,t4,Entity Framework,Mapping,T4,我目前正在开发一个应用程序,它的对象模型和持久层是使用实体框架模型设计器构建的 我的一个要求是为我的实体提供一个状态,当它们处于“脏”状态(修改)时,当状态发生变化时,最重要的是,在断开连接的模式下工作时,可以让我知道它们的状态。因此,我开始修改T4模板,在生成这些实体时添加一个IsDirty布尔属性,添加一个在IsDirty更改时触发的事件,并在所有标量属性的xxxChanged方法中添加this.IsDirty=true 当实体未附加到其上下文时,但当附加时,每当属性发生更改,从而将IsDi

我目前正在开发一个应用程序,它的对象模型和持久层是使用实体框架模型设计器构建的

我的一个要求是为我的实体提供一个状态,当它们处于“脏”状态(修改)时,当状态发生变化时,最重要的是,在断开连接的模式下工作时,可以让我知道它们的状态。因此,我开始修改T4模板,在生成这些实体时添加一个
IsDirty
布尔属性,添加一个在
IsDirty
更改时触发的事件,并在所有标量属性的xxxChanged方法中添加
this.IsDirty=true

当实体未附加到其上下文时,但当附加时,每当属性发生更改,从而将
IsDirty
值更改为
false
时,所有操作都非常有效,我收到此异常:

属性“IsDirty”在上没有有效的实体映射 实体对象。有关更多信息,请参见实体框架 文件

那么我做错了什么?我不希望这个属性映射到我的数据库中,因为它只是一个对象状态,只在对象处于“活动”状态时才起作用。是否有一个属性我应该用来装饰
IsDirty
属性?还是应该派生EntityObject并实现状态机制?或者你对如何实施这一点有什么更好的建议

谢谢


编辑:我正在使用实体框架4.0和EDM设计器

下面是生成到每个基本实体中的一段代码:

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);
    }
}

我终于自己发现了错误。问题出在我的财产设定器内部。我不应该调用
ReportPropertyChanged/ing
,而应该调用
OnPropertyChanged/ing

ReportPropertyChanged/ing
意味着上下文搜索原始实体值和当前实体值之间的更改,但由于此属性只是一个没有映射到存储的状态对象,因此原始值的概念毫无意义,因此上下文无法找到此属性的正确映射


使用
OnPropertyChanged/ing
刚刚修复了它。

我终于自己找到了错误。问题出在我的财产设定器内部。我不应该调用
ReportPropertyChanged/ing
,而应该调用
OnPropertyChanged/ing

ReportPropertyChanged/ing
意味着上下文搜索原始实体值和当前实体值之间的更改,但由于此属性只是一个没有映射到存储的状态对象,因此原始值的概念毫无意义,因此上下文无法找到此属性的正确映射


使用
OnPropertyChanged/ing
刚刚修复了它。

可能的重复,请尝试使用[NotMapped],我认为NotMapped只能首先与代码一起使用。我是通过EDM设计器首先使用模型的。我很确定,如果您正在修改T4,并且有权访问它应该可以工作的生成实体(显然是EF4.1+),您可以尝试一下,否则您可以通过从模型视图中删除它来忽略这些内容。这应该可以毫无问题地工作。您是如何将该属性添加到T4模板的。你有没有用属性标记它?@Luke:是的,我就是这么做的,只是在代码生成中添加一个支持字段和一个带有内部集合的属性访问器。可能的重复,请尝试使用[NotMapped],我认为NotMapped只在代码中起作用。我是通过EDM设计器首先使用模型的。我很确定,如果您正在修改T4,并且有权访问它应该可以工作的生成实体(显然是EF4.1+),您可以尝试一下,否则您可以通过从模型视图中删除它来忽略这些内容。这应该可以毫无问题地工作。您是如何将该属性添加到T4模板的。你有没有用属性标记它?@Luke:是的,我就是这么做的,只是在代码生成中添加一个支持字段和一个带有内部集合的属性访问器。