0

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

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

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

UnitOfWork 要么引发异常,说明实体已加载到另一个 DBContext 中(当 Department 延迟加载 DynamicProxy 时),要么在 Department 表中插入新行。

我什至找不到一个缓存参考数据的示例……我不敢相信没有人遇到过这个问题。要么我没有找对地方,要么没有使用正确的关键字。我希望使用 EF 可以做到这一点。如果您能分享您的经验或发布一些参考资料,我将不胜感激。我对此有点陌生,所以想避免使用太多框架,而只使用带有 WPF/EF 堆栈的 POCO。

4

3 回答 3

1

尝试附加您的缓存项目(可能,您会在附加之前进行克隆):

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

请参阅使用 DbContext...文章。

于 2012-05-11T06:36:30.893 回答
0

您提到您为此使用 WPF,在这种情况下,您不必每次想要与域层交互时都打开一个新的 DBContext。(如果这与您热衷于使用的 UoW 相违背,我们深表歉意)

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

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

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

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

于 2012-05-11T07:23:07.357 回答
0

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

虽然这个博客声称 FK 和 Navi 属性是由 EF 同步的,但我无法让它工作。

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

于 2012-05-12T12:46:10.947 回答