Entity framework core EF Core:更新实体而不首先查询它
我正在寻找一种方法,通过了解实体的主键来更新实体的属性,而不必首先查询它 我提出的解决方案是:Entity framework core EF Core:更新实体而不首先查询它,entity-framework-core,Entity Framework Core,我正在寻找一种方法,通过了解实体的主键来更新实体的属性,而不必首先查询它 我提出的解决方案是: var order=new OrderEntity() { Id=5 }; db.Orders.Attach(order).State=EntityState.Unchanged; order.Name=“smth”; db.SaveChanges(); 这似乎很好,因为生成的SQL正是我所期望的: 更新“订单”设置“名称”=@p0 其中“Id”=@p1; 问题:这是正确的做法吗 我在官方文件中找
var order=new OrderEntity()
{
Id=5
};
db.Orders.Attach(order).State=EntityState.Unchanged;
order.Name=“smth”;
db.SaveChanges();
这似乎很好,因为生成的SQL正是我所期望的:
更新“订单”设置“名称”=@p0
其中“Id”=@p1;
问题:这是正确的做法吗
我在官方文件中找不到关于这一点的任何确认,实际上在网络上的任何其他地方也找不到。关于实体框架(非核心)也有类似的问题,它们似乎使用了不同的策略,比如设置EntityState.Modified
而不是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();
啊,对!!我没有想到这一点。我想一种解决方法是强制将该值视为已修改:db.Entry(order).Property(x=>x.Amount).IsModified=true代码>。不过有点冗长。我只是注意到你提供的链接是关于EF6而不是EF Core的,这就解释了为什么我找不到上面提到的行为。我想在这种情况下也是一样的,对不起。我更改了参考号。EF Core的文本不同,但基本上讲的是相同的故事。将属性状态设置为IsModified
无疑是一种非常健壮的方法。谢谢。但这不是官方文件。我现在看到默认状态在中有很好的解释,但在关于分离实体的页面中没有解释