gpt4 book ai didi

entity-framework-core - EF 核心 : updating an entity without querying it first

转载 作者:行者123 更新时间:2023-12-05 02:59:02 24 4
gpt4 key购买 nike

我正在寻找一种通过了解实体的主键来更新实体属性的方法,而无需首先查询它。

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

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;

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

我在官方文档或网络上的其他任何地方都找不到关于此的任何确认。类似的问题是关于 Entity Framework (非核心)的,他们似乎使用不同的策略,比如设置 EntityState.Modified 而不是 Unchanged。我也试过了,但它具有更新所有属性的效果,这不是我想要实现的。所以我想知道上面的解决方案是否遗漏了什么。

谢谢。

最佳答案

DbContext.Attach Method 的文档说:

Begins tracking the given entity and entries reachable from the given entity using the Unchanged state by default, but see below for cases when a different state will be used.
[...]
For entity types with generated keys if an entity has its primary key value set then it will be tracked in the Unchanged state. If the primary key value is not set then it will be tracked in the Added state.
[...]
For entity types without generated keys, the state set is always Unchanged.
[...]

因此甚至没有必要将状态设置为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();

关于entity-framework-core - EF 核心 : updating an entity without querying it first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58367172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com