3

我有一些从实现 INotifyPropertyChanged 的​​通用业务基类继承的 POCO。我也在 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 来管理它?

4

2 回答 2

3

您通过订阅对象内的事件来“激活” INotifyPropertyChanged,而这在对象被实例化之前无法完成。

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

有关详细信息,请参阅MSDN


更新:

您可以订阅 的ObjectMaterialized事件ObjectContext以将您的对象标记为已加载。像这样的东西:

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

实现你的功能

ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e).

EventArgs会给你你刚刚实现的对象。

于 2013-03-22T10:38:52.677 回答
0

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

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

于 2013-03-22T09:13:59.143 回答