实体框架 - 保存数据时如何失败

发布于 2024-10-23 21:41:28 字数 260 浏览 1 评论 0原文

让我们假设情况如下:我的应用程序中有一个对象上下文,我从数据库下载 15k 条记录(如 15k 份发票)。用户选择一个并对其进行一些更改。我调用 SaveChanges() 并由于某种原因失败(无论什么原因)。

现在使用的上下文无法执行任何保存,因为它无法保存这些更改。我应该做什么才能让它发挥作用?

另一种情况是我使用单独的上下文来进行更改。如果保存失败,那么什么也不会发生 - 我丢弃上下文,仅此而已。出现的问题是:如何将更改合并回主上下文? (无需再次下载15k记录)

let's suppose the situation looks like this: I have one object context in my app and I download 15k records from the db (like 15k invoices). User picks one and makes some changes to it. I call SaveChanges() and it fails for some reason (doesn't matter what reason).

Now the context that was used can't perform any save because it wasn't able to save those changes. What should I do to make it work?

Another scenario is that I use a separate context for making changes. If saving fails then nothing happens - I discard the context and that's it. The problem that arises is: how to merge changes back to the main context? (without downloading 15k records once again)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏雨凉 2024-10-30 21:41:28

下载 15k 条记录的想法听起来很糟糕,但我们假设您必须这样做。为了使这项工作正常进行,您必须遵循的场景应如下所示:

  1. 创建用于数据检索的第一个上下文。
  2. 执行查询以获取 15k 条记录。以 NoTracking 方式执行查询(ObjectQueryMergeOption)!它将提高性能,因为这些记录将永远不会再次在上下文中使用。
  3. 关闭第一个上下文
  4. 用户选择和发票 = 创建发票的深度克隆并将其附加到新上下文(如果是 WPF 或 WinForm 应用程序)
  5. 用户保存更改并引发异常。如果您想以某种方式处理异常,您仍然只有单个发票的上下文。您可以处理上下文并返回到原始的未受影响的记录集。
  6. 如果实体已保存,您应该将更改合并回列表,因为 15k 记录中的实体不会自动更新。

Idea of downloading 15k records smells pretty bad but lets assume you must do it. The scenario you must follow to make this work should look like:

  1. Create first context for data retrieval.
  2. Execute query to get your 15k records. Execute query as NoTracking (MergeOption of ObjectQuery)! It will improve performance because these records will never be used in context again.
  3. Close first context
  4. User picks and invoice = create deep clone of the invoice and attach it to a new context (in case of WPF or WinForm application)
  5. User saves changes and exception is fired. If you want to deal with exception somehow you still have only context with single invoice. You can dispose context and return to your original set of unaffected records.
  6. If the entity is saved you should merge changes back to list because your entity in 15k records will not be updated automatically.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文