【问题标题】:Entity framework - persisting a graph of POCO entities实体框架 - 持久化 POCO 实体图
【发布时间】:2013-04-03 20:51:28
【问题描述】:

在我的应用程序中,我需要检索一个大型实体图,在分离时进行各种更改(添加实体、进行更改、删除实体),然后将图保存回数据库。我已经尝试过 STE,但它开始使我的客户端层的某些方面过于复杂,所以我希望通过使用 POCO 来保持简单(至少在客户端)。

当谈到持久化更改时,我想我可以再次从数据库中检索图形,然后遍历该图形和客户端层的图形,寻找差异:-

  • 如果实体存在于数据库图中但不存在于客户端图中,则会执行删除操作。大概我可以从数据库图中.Remove() 这些。
  • 新实体是客户端图中 ID 为 0 的实体。大概我可以将这些 .Add() 发送到数据库图。
  • 我不确定处理更新的最佳方式。我不想在我的实体上实现“IsDirty”标志,并且更喜欢更自动化的解决方案。那么 a) 有没有办法将客户端图中的实体与其数据库对应项进行比较,以查看它是否已更改,以及 b) 将客户端实体应用/合并到其数据库对应项中的最佳方法是什么?

完成所有这些后,我大概只需在数据库图上调用 SaveChanges()。我还必须将此图传递回客户端,以确保它具有最新版本(数据库生成的值,例如 ID、时间戳)。

我的解决方案是否过于简单?如果可行,我该如何处理上述更新?

【问题讨论】:

  • 这是一个广泛的主题。我建议你找一本 Lerman & Miller 的书DbContext,并通读第 4 章,了解如何处理不连贯的实体。他们提出的方法是实现一个接口IObjectWithState,它使对象跟踪它们自己的变化状态。我不能说它真的很优雅,但可能比你自己遍历一个特定的对象图更通用。

标签: entity-framework


【解决方案1】:

您的解决方案可以工作,但实现起来并不简单 - 特别是如果您尝试以某种通用的方式执行它(检查this question 中的答案 - 有人提供了一个应该已经实现的代码库)。它还会导致大量额外的数据库流量,因此当您预计会有一些重负载时,这绝对不是一个好方法。最简单的解决方案是@Gert Arnold 提到的。

【讨论】:

  • 我尝试了 Lerman 方法,虽然它有效,但由于我使用的层次结构非常大,因此在 BLL 中工作量很大。它还使客户更加复杂,因为关系修复涉及更多,除其他外。它只是一个 2 层 WCF 应用程序,所以我正在重新考虑我的方法。如果您能抽出几分钟回复,请看一下:stackoverflow.com/questions/15790286/…
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 2012-02-08
  • 2012-03-22
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多