保存实体之前 EF Core 脏检查

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 会跳过更新还是无论如何都会发布更新?

谢谢。

ati*_*yar 5

我的问题是,更新前 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)