是否有一种方法可以防止EF6在保存后恢复实体上的属性
本文关键字:保存 EF6 恢复 实体 属性 一种 方法 是否 | 更新日期: 2023-09-27 17:54:46
我使用CodeFirst和EF6与各州的单独映射。
我有一个奇怪的场景,如下:
- 创建一个新的till实体(状态为'Added')。
- 指定一个结束值,即'99.01m'。
- 保存到DB(直到保存成功)。
- 创建一个新的订单对象
- 创建订单项对象/s
- 更新到关闭值以反映成功的订单,即'101.01m'。
- 将订单对象保存到DB (状态为'added'并成功保存)。
- 保存后,检查关闭值
- 观察截止值,预期的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更改
在断开连接的情况下,一种方法是分离所讨论的实体:
// detach the till to prevent it from being tracked.
Cache.TodaysCashDraw.ObjectState = ObjectState.Detached;
当你需要保存它的状态时,只需重新附加它:
_ctx.Context.Set<CashDrawsMony>().Attach(_till);
这完全解决了我的问题。
在一个更幽默的笔记上,我实际上是在看附加方法,想知道它是干什么用的?div =)