在实体框架5返回的poco中激活INotifyPropertyChanged的推荐实践

本文关键字:INotifyPropertyChanged 激活 poco 框架 实体 返回 | 更新日期: 2023-09-27 18:05:10

我有一些poco从实现INotifyPropertyChanged的公共业务基类继承。我也使用EF5在DAL。如果我要对单个竞争对象执行fetch操作,如下所示:

public ICompetitorCard Fetch(long id)
        {
            return this.Fetch<ContactCardContext, ICompetitorCard>(
               () => { return ContactCardContext.GetInstance(this); },
               ctx =>
               {
                   var query = from competitor in ctx.Competitors
                               where competitor.Id == id
                               select competitor;
                   return query.SingleOrDefault();
               }, "ICompetitorCard Fetch(long id) failed");
        }
我得到了我的competorcard对象,用EF5很好地填充。问题是我不希望从DAL加载时触发通知。通常我可能会设置一些字段来跟踪对象是否被初始化。这很容易实现"正常",但由于在这种情况下EF正在做加载,我想知道我需要钩到什么事件/虚拟方法,以便设置
IsInitialised = true;

使属性通知触发。我想我可以这样做:

ICompetitorCard card = query.SingleOrDefault();
if (card!=null){card.IsInitialised = true;}
return card;

但是这看起来过于冗长,破坏了封装,并且对集合来说是一个痛苦。因此,对于那些处理自己的INotifyPropertyChanged实现他们是如何管理这与EF5?

在实体框架5返回的poco中激活INotifyPropertyChanged的推荐实践

通过订阅对象内的事件来"激活" INotifyPropertyChanged,这在对象实例化之前是无法完成的。

在对象中,除非存在订阅者,否则不会引发更改事件。

查看MSDN获取更多信息。


更新:

您可以订阅ObjectContextObjectMaterialized事件来标记您的对象已加载。像这样:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
this.ObjectContext_OnObjectMaterialized;

实现你的功能

ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e).

EventArgs将给出您的对象,它刚刚被物化。

通常,用于实体框架的poco类型不会实现INotifyPropertyChanged,您可以将所需属性的值映射到一个新类型,然后绑定到视图(它确实实现了INotifyPropertyChanged)…这取决于您的体系结构,它可能是一个业务对象,甚至可能是一个视图模型。

这在很多情况下都很有用,特别是当您的数据库很少能完美地代表您的UI时。