C# 保存实体前的EF Core脏检查
如果我想用下面的EF核心代码更新数据库中的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
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是否会在给定场景中发布/提交实体的更新,而不是如何更新。