我正在开发一个使用Entity Framework和WPF以及MVVM设计模式的应用程序。我有很多实体,但为了简单起见,我们只使用它们的一部分。可以包含联系人,地址和电话号码的公司;上述联系人包含地址,电话号码和货件。
最初我从数据库加载这些实体,并打开DataContext以便以后再次使用。这从并发方面提出了问题,因为任何已更新的对象很可能无法在程序的其他部分正确表示,因为这些部分尚未更新。
我正在尝试一些新的东西。在我的MainViewModel(可以从其他所有ViewModel轻松访问)中,我有几个ObservableCollections(我在使用WPF Databound对象时选择的通用集合),我打算暂时存储我的实体。还有几种方法可以处理向上下文添加实体,附加,分离,保存更改等。在我的Record Collection中显示ViewModel(例如CompaniesViewModel)我有一个后台工作者加载实体,分离它们并存储它们在MainViewModel的集合中。不幸的是,我显然必须创建显式查询,例如:
Dim results = From Comp As Company In RVShipContext.Companies _
.Include("Contacts.PhoneNumbers") _
.Include("Addresses") _
.Include("PhoneNumbers") Select Comp
请注意,这不是一个问题,除非需要加载联系人,现在我必须返回(附加,查询,分离)以获取地址和发货。现在,我没有真正的问题,但这些图中的一些将是几层深。一个Shimpent包含一个或多个包,其中包含一个或多个包含多个磁盘的DiskSet。
使用分离的实体时,有没有办法轻松加载大图? 有没有办法在使用分离的实体时有效地使用LazyLoading? 将我的实体保存在一组中心集合中(可以被程序的其他部分访问)是一个好主意,还是应该在我花费大量时间为其设置基础架构之前放弃它?
非常感谢任何帮助!
答案 0 :(得分:1)
你应该放弃目前的做法。我不了解WPF是一个VMMV,但是对于MVP(模型 - 视图 - 演示者),您应该为每个Presenter使用一个ObjectContext
/ DbContext
实例并保持您的实体连接。检查this article - 它与NHibernate有关,但原理是一样的。类似的方法应该与VMMV一起使用。
您的查询的复杂性看起来像是在尝试将所有内容加载到非常problematic solution的共享上下文中。特别是像WPF应用程序这样的有状态应用程序中的分离实体在将更改附加到上下文而不是使用附加实体并让上下文跟踪更改时,看起来像是一个很大的开销和很多工作要做。保持实体附加也解决了延迟加载的问题。