是否有一种方法可以防止EF6在保存后恢复实体上的属性

本文关键字:保存 EF6 恢复 实体 属性 一种 方法 是否 | 更新日期: 2023-09-27 17:54:46

我使用CodeFirstEF6与各州的单独映射。

我有一个奇怪的场景,如下:

  1. 创建一个新的till实体(状态为'Added')。
  2. 指定一个结束值,即'99.01m'
  3. 保存到DB(直到保存成功)。
  4. 创建一个新的订单对象
  5. 创建订单项对象/s
  6. 更新到关闭值以反映成功的订单,即'101.01m'。
  7. 将订单对象保存到DB (状态为'added'并成功保存)。
  8. 保存后,检查关闭值
  9. 观察截止值,预期的101.01实际上是99.01m

如果我显式地标记了till:

Cache.TodaysCashDraw.ObjectState = ObjectState.Unchanged;

无论是否应用对象状态,值都将被还原。

Cache.TodaysCashDraw.ObjectState = ObjectState.Modified;

然而,如果我标记为已修改,则99.01m被提交到DB。

所以基本上我的till对象上出现的任何变化都被还原了,现在这很好,但我想解释一下为什么?理想情况下,我希望我的till对象上的更改被持久化,而不是如上所示的恢复。由于在工作日内钱柜会多次更改,所以我希望只在必要时提交钱柜的更改。订单和项目应该立即保存,但是内存中的Till对象只需要反映针对它处理的订单。这就是我目前的想法和方法,在EF4和DB First中工作得很好。

有谁知道这里发生了什么,解决这个问题的理想方法是什么?

一个蹩脚的备份计划是直接提交till更改

是否有一种方法可以防止EF6在保存后恢复实体上的属性

在断开连接的情况下,一种方法是分离所讨论的实体:

            // detach the till to prevent it from being tracked.
            Cache.TodaysCashDraw.ObjectState = ObjectState.Detached;

当你需要保存它的状态时,只需重新附加它:

           _ctx.Context.Set<CashDrawsMony>().Attach(_till);

这完全解决了我的问题。

在一个更幽默的笔记上,我实际上是在看附加方法,想知道它是干什么用的?div =)