【问题标题】:Implementing a custom non-mapped property on entities在实体上实现自定义非映射属性
【发布时间】: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


【解决方案1】:

我终于自己发现了错误。问题出在我的属性设置器中。我应该打电话给OnPropertyChanged/ing,而不是打电话给ReportPropertyChanged/ing

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

使用OnPropertyChanged/ing 刚刚修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多