Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core EF Core:更新实体而不首先查询它_Entity Framework Core - Fatal编程技术网

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
无疑是一种非常健壮的方法。谢谢。但这不是官方文件。我现在看到默认状态在中有很好的解释,但在关于分离实体的页面中没有解释