实体框架 - 为什么要明确将实体状态设置为修改?

问题描述 投票:0回答:2

官方文档说要修改实体,我检索了一个dbentityentry对象,并且要么使用属性功能,要么设置其状态进行修改。它使用以下示例

Department dpt = context.Departments.FirstOrDefault();
DbEntityEntry entry = context.Entry(dpt);
entry.State = EntityState.Modified;

我不了解第二和第三语句的目的。如果我向像第一语句这样的实体询问框架,然后将poco修改为in

dpt.Name = "Blah"

如果我要求ef到savechanges(),则实体是修改后的状态(我猜是通过快照跟踪,这不是代理),并且更改将持续,而无需手动设置状态。我在这里错过了什么吗?

在您的情况下,您确实不必设置状态。更改跟踪的目的是发现您已更改了附件实体的价值并将其放在修改状态。对于独立实体(无需更改跟踪的实体或在当前上下文之外创建的实体),手动设置状态很重要。
entity-framework
2个回答
59
投票

正如所说,在与断开实体的情况下,将实体的状态设置为

Modified

48
投票
但是有很好的理由不将国家设置为

Modified

记录中的所有字段将被更新,而不仅仅是更改。这意味着数据库的工作量超过了必要。但是,也有许多系统进行了审核。更新所有字段将引起大量混乱,或者需要审核机制来过滤错误更改。

optimistic并发。由于所有字段均已更新,因此可能会导致更多的冲突和覆盖。如果两个用户同时更新相同的记录,但不是相同的字段,则不必发生冲突。但是,如果他们总是更新所有字段,那么最后一个用户将始终尝试编写过时的数据。这充其量最多将导致乐观的并发异常或在最坏的情况下数据丢失。

无使用的更新。无论如何,该实体被标记为修改。未经审计的实体也会发射更新。如果可以打开编辑窗口以查看详细信息并由

OK
  1. Modified

    关闭,则可能很容易发生。

  2. 这是一个很好的平衡。减少往返或减少冗余。

    任何人,将状态设置为

    DbContext
  3. 的替代方案是(使用
  4. void UpdateDepartment(Department department) { var dpt = context.Departments.Find(department.Id); context.Entry(dpt).CurrentValues.SetValues(department); context.SaveChanges(); }

    api): CurrentValues.SetValues

    Modified
  5. 将单个属性标记为
Modified

.

或附加断开的实体并将单个属性标记为手动:

context.Entry(dpt).State = System.Data.Entity.EntityState.Unchanged;
context.Entry(dpt).Property(d => d.Name).IsModified = true;
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.