在实体框架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?
通过订阅对象内的事件来"激活" INotifyPropertyChanged
,这在对象实例化之前是无法完成的。
在对象中,除非存在订阅者,否则不会引发更改事件。
查看MSDN获取更多信息。
更新:
您可以订阅ObjectContext
的ObjectMaterialized
事件来标记您的对象已加载。像这样:
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
this.ObjectContext_OnObjectMaterialized;
实现你的功能
ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e).
EventArgs
将给出您的对象,它刚刚被物化。
通常,用于实体框架的poco类型不会实现INotifyPropertyChanged,您可以将所需属性的值映射到一个新类型,然后绑定到视图(它确实实现了INotifyPropertyChanged)…这取决于您的体系结构,它可能是一个业务对象,甚至可能是一个视图模型。
这在很多情况下都很有用,特别是当您的数据库很少能完美地代表您的UI时。