Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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
C# 保存实体前的EF Core脏检查_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 保存实体前的EF Core脏检查

C# 保存实体前的EF Core脏检查,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,如果我想用下面的EF核心代码更新数据库中的Book实体 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.Save

如果我想用下面的EF核心代码更新数据库中的
Book
实体

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();
    }
}
我的问题是,在更新之前,bookEntity的标题是否是“为傻瓜在10天内致富”。EF core会跳过更新还是会发布更新


谢谢。

EF core将跳过更新。如果要保存更改,可以使用以下语法,例如:

using (var db = new MyContextDB())
{
    var bookEntity = db.Books.SingleOrDefault(b => b.Id == 123);
    if (bookEntity != null)
    {
        bookEntity.Title = "Get rich in 10 days for dummies";
        db.Entry(bookEntity).Property(i=> i.Title).IsModified = true; 
        db.SaveChanges();
    }
}

EF core将跳过更新。如果要保存更改,可以使用以下语法,例如:

using (var db = new MyContextDB())
{
    var bookEntity = db.Books.SingleOrDefault(b => b.Id == 123);
    if (bookEntity != null)
    {
        bookEntity.Title = "Get rich in 10 days for dummies";
        db.Entry(bookEntity).Property(i=> i.Title).IsModified = true; 
        db.SaveChanges();
    }
}
更新前,如果bookEntity的标题是“为傻瓜在10天内致富”。EF core会跳过更新还是会发布更新

不,实体框架内部使用ChangeTracker

因此,如果再次将完全相同的值指定给实体,它将不会对此属性发出更新查询

要覆盖此行为,您需要将其设置为

更新前,如果bookEntity的标题是“为傻瓜在10天内致富”。EF core会跳过更新还是会发布更新

不,实体框架内部使用ChangeTracker

因此,如果再次将完全相同的值指定给实体,它将不会对此属性发出更新查询

要覆盖此行为,您需要将其设置为

我的问题是,如果簿记实体的标题是“在10天内致富” 更新前的“傻瓜”。EF core会跳过更新还是会发出 不管怎么更新

不,不会的

EF根据实体的状态为其发出SQL命令。对于
未更改的实体
状态,EF不会发出任何SQL命令

当您从数据库中获取
bookEntity
时,EF开始以
Unchanged
状态跟踪它,它知道数据库中该实体的每个属性的值。如果修改任何属性,EF会将实体标记为已修改,并在下一次调用时发出更新命令。但是,如果将已经存在的值设置为属性,则实际上没有修改实体。因此,实体状态保持不变,EF不会对此发布任何更新

您可以使用以下代码检查实体状态-

使用(var db=new MyContextDB())
{
var bookEntity=db.Books.SingleOrDefault(b=>b.Id==123);
如果(结果!=null)
{
var stateBefore=dbCtx.Entry(bookEntity).State;//状态为“未更改”
bookEntity.Title=“傻瓜10天致富”;
var stateAfter=dbCtx.Entry(bookEntity).State;//状态为“未更改”
db.SaveChanges();
}
}
我的问题是,如果簿记实体的标题是“在10天内致富” 更新前的“傻瓜”。EF core会跳过更新还是会发出 不管怎么更新

不,不会的

EF根据实体的状态为其发出SQL命令。对于
未更改的实体
状态,EF不会发出任何SQL命令

当您从数据库中获取
bookEntity
时,EF开始以
Unchanged
状态跟踪它,它知道数据库中该实体的每个属性的值。如果修改任何属性,EF会将实体标记为已修改,并在下一次调用时发出更新命令。但是,如果将已经存在的值设置为属性,则实际上没有修改实体。因此,实体状态保持不变,EF不会对此发布任何更新

您可以使用以下代码检查实体状态-

使用(var db=new MyContextDB())
{
var bookEntity=db.Books.SingleOrDefault(b=>b.Id==123);
如果(结果!=null)
{
var stateBefore=dbCtx.Entry(bookEntity).State;//状态为“未更改”
bookEntity.Title=“傻瓜10天致富”;
var stateAfter=dbCtx.Entry(bookEntity).State;//状态为“未更改”
db.SaveChanges();
}
}

SaveChanges只提交事务。看起来您正在从db查询book实体,这将把它添加到changetracker中。更新标题“应”在更改跟踪器中捕获,并在保存更改时提交。给它一个测试,但你的代码似乎应该可以工作。示例更改跟踪程序使用类似于你的代码SaveChanges只是提交事务。看起来您正在从db查询book实体,这将把它添加到changetracker中。更新标题“应”在更改跟踪器中捕获,并在保存更改时提交。给它一个测试,但你的代码似乎应该工作。示例更改跟踪器使用类似于你的代码,这是不正确的。检查问题@Zakk Diaz comments中的-docs.microsoft.com/en-us/ef/core/change-tracking我认为问题是,如果
db.Entry(bookEntity).Property(i=>i.Title).IsModified=true
是默认行为,如果值相同,则不是。OP询问EF是否会在给定场景中发布/提交实体的更新,而不是如何更新。这不是真的。检查问题@Zakk Diaz comments中的-docs.microsoft.com/en-us/ef/core/change-tracking我认为问题是,如果
db.Entry(bookEntity).Property(i=>i.Title).IsModified=true
是默认行为,如果值相同,则不是。OP询问EF是否会在给定场景中发布/提交实体的更新,而不是如何更新。