sea*_*717 0 c# entity-framework entity-framework-core
如果我想Book使用这样的 EF 核心代码更新数据库中的实体
using (var db = new MyContextDB())
{
var bookEntity = db.Books.SingleOrDefault(b => b.Id == 123);
if (result != null)
{
bookEntity.Title = "Get rich in 10 days for dummies";
db.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,更新前 bookEntity 的标题是否为“傻瓜 10 天致富”。EF core 会跳过更新还是无论如何都会发布更新?
谢谢。
我的问题是,更新前 bookEntity 的标题是否为“傻瓜 10 天致富”。EF core 会跳过更新还是无论如何都会发布更新?
不,不会的。
EF 根据实体的状态为实体发出 SQL 命令。对于状态为 EF 的实体,Unchanged不发出任何 SQL 命令。
当您从数据库中获取EF 时bookEntity,EF 开始使用状态跟踪它Unchanged,并且它知道数据库中该实体的每个属性的值是什么。如果您修改任何属性,EF 会将实体标记为Modified,并在下次调用时发出更新命令SaveChanges()。但是,如果您将已经存在的值设置为属性,那么您实际上并没有修改实体。因此,实体状态仍然存在Unchanged,EF 不会为此发布任何更新。
您可以使用以下代码检查实体状态 -
using (var db = new MyContextDB())
{
var bookEntity = db.Books.SingleOrDefault(b => b.Id == 123);
if (result != null)
{
var stateBefore = db.Entry(bookEntity).State; // state is "Unchanged"
bookEntity.Title = "Get rich in 10 days for dummies";
var stateAfter = db.Entry(bookEntity).State; // state is sill "Unchanged"
db.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)