在Entity Framework 5返回的POCO中激活INotifyPropertyChanged的推荐做法

时间:2013-03-22 09:08:55

标签: c# entity-framework entity-framework-5

我有一些POCO继承自实现INotifyPropertyChanged的公共业务基类。 我也在DAL使用EF5。如果我要为一个竞争对象做一个获取,如下所示:

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

我得到了很好地填充EF5的我的CompetitorCard对象。问题是我不希望从DAL加载时触发通知。所以我通常会设置某种跟踪对象是否已初始化的字段。这很容易实现“正常”,但因为在这种情况下EF正在进行加载我想知道我需要挂钩的事件/虚拟方法才能设置

IsInitialised = true;

此后财产通知会被激活。我想我可以做类似的事情:

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

但这看起来过于冗长,打破了封装,对收集等感到痛苦。因此对于那些处理他们自己的INotifyPropertyChanged实现的人来说,他们如何使用EF5来管理它?

2 个答案:

答案 0 :(得分:3)

您通过订阅对象中的事件来“激活”INotifyPropertyChanged,直到对象被实例化后才能执行此操作。

在您的对象中,除非有订阅者,否则不会发出更改事件。

有关详细信息,请参阅MSDN


更新:

您可以订阅ObjectMaterialized的{​​{1}}事件,将您的对象标记为已加载。像这样:

ObjectContext

实现你的功能

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

ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e). 将为您提供刚刚实现的对象。

答案 1 :(得分:0)

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

这在许多情况下都很有用,尤其是因为您的数据库很难完美地完美地表示您的UI。