EF Core:更新实体而不先查询

时间:2019-10-13 19:41:08

标签: entity-framework-core

我正在寻找一种无需先查询即可通过知道其主键来更新实体属性的方法。

我想出的解决方案是这个:

var order = new OrderEntity()
{
    Id = 5
};

db.Orders.Attach(order).State = EntityState.Unchanged;

order.Name = "smth";

db.SaveChanges();

似乎可以正常工作,因为生成的SQL正是我所期望的:

UPDATE "Orders" SET "Name" = @p0
WHERE "Id" = @p1;

问题:这是正确的方法吗?

我在官方文档中或实际上在网络上的任何其他位置都找不到关于此的任何确认。关于实体框架(非核心)的问题类似,它们似乎使用不同的策略,例如设置EntityState.Modified而不是Unchanged。我也尝试过,但是它具有更新所有属性的效果,这不是我想要实现的。所以我想知道上面的解决方案是否缺少我的东西。

谢谢。

1 个答案:

答案 0 :(得分:1)

DbContext.Attach Method的文档说:

  

默认情况下开始使用 Unchanged 状态跟踪给定实体和从给定实体可访问的条目,但请参见下文,了解将使用其他状态的情况。
  [...]
  对于具有生成键的实体类型,如果一个实体设置了其主键值,则将以未更改状态对其进行跟踪。如果未设置主键值,则会在 Added 状态下对其进行跟踪。
  [...]
  对于没有生成键的实体类型,状态集始终为未更改
  [...]

因此甚至不需要将状态设置为Unchanged

但是要小心。如果您设置例如order.Amount = 0m;清除金额,这将不起作用,因为不会检测到任何更改。写

var order = new OrderEntity()
{
    Id = 5,
    Amount = 1.00m; // Dummy value unequal 0.00m
};
db.Orders.Attach(order);

// Make the change    
order.Amount = 0.00m; // Now, this change will be detected.

db.SaveChanges();