需要EF Code First / WPF应用程序架构指南

时间:2012-05-10 10:36:54

标签: wpf caching architecture frameworks entity

我正在开发一个2层WPF / EF Code First应用程序。我做了很多谷歌搜索,但找不到我正在寻找的样本实现...希望这个论坛上有人可以帮助我。以下是要求:

  • 在应用程序启动时
    1. 打开DBContext
    2. 在应用程序启动时将参考数据缓存在各种地图/列表中
    3. 关闭上下文。
  • 当用户打开表单时
    1. 打开一个DBContext(我在这里使用UnitOfWork模式)
    2. 从编辑上下文中获取实体的新副本。
    3. 点击“保存”按钮时调用SaveChanges()。
    4. 关闭上下文。

当我使用Cache中的对象更改导航属性时,问题就会出现。 例如使用下拉(由使用不同DBContext创建的缓存支持)来设置部门导航属性。

UnitOfWork会抛出一个异常,说实体已加载到另一个DBContext中(当Department是延迟加载的DynamicProxy时)或在Department表中插入一个新行。

我甚至找不到一个缓存参考数据的例子......我无法相信没有人遇到过这个问题。要么我没有找到正确的地方,要么没有使用正确的关键字。 我希望使用EF可行。如果您能分享您的经验或发布一些参考资料,我将不胜感激。 我对此有点新意,所以我希望避免使用太多的框架,只需坚持使用WPF / EF堆栈的POCO。

3 个答案:

答案 0 :(得分:1)

尝试附加缓存的项目(可能在附加之前制作克隆):

var existingUnicorn = GetMyExistingUnicorn();
using (var context = new UnicornsContext())
{
    context.Unicorns.Attach(existingUnicorn);
    context.SaveChanges();
}

请参阅Using DbContext...文章。

答案 1 :(得分:0)

你提到你正在使用WPF,在这种情况下,你不必每次想要与域层交互时都打开一个新的DBContext。 (如果这与你热衷于使用的UoW相矛盾,请道歉)

我个人一直在为桌面应用程序使用代码优先开发,并且我发现汇集上下文(以及连接)可以防止出现这个问题,并且到目前为止还没有出现任何问题。

原则上,只要启动应用程序,就会为主UI线程打开一个主Context对象,并在整个应用程序生命周期内保持打开状态。它以静态方式存储,并在使用时由任何Repository类检索。

对于多线程场景,任何后台线程都可以自由打开其他上下文并在存储库中使用它们以防止任何竞争条件。

如果您采用这种方法,您会发现由于所有存储库共享相同的上下文,因此对象上下文跟踪不会产生任何问题。

答案 2 :(得分:0)

除了导航之外,我最终定义了int外键属性。 在我的应用程序中,我只修改int属性并使用navigation属性显示详细信息(只读控件)。 虽然这有效但它使应用程序有点脆弱,有时也不一致。

虽然这篇博客声称FK& Navi属性由EF同步,但我无法使其工作。

http://coding.abel.nu/2012/03/ef-code-first-navigation-properties-and-foreign-keys