我有一些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来管理它?
答案 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。