EF 是否会识别对超出服务范围的实体所做的更改
本文关键字:实体 服务范围 是否 识别 EF | 更新日期: 2023-09-27 18:33:04
给定一个Service
和一个Helper
类,如果在Service
中创建了一个对象,传递回调用Helper
类,然后更改,如果我们调用SaveChanges()
,实体框架会识别并应用更改吗?
帮助程序类
public MyHelper {
private readonly Service _Service;
private DoStuff(){
PersonEntity myPerson = this._Service.CreateNewPerson();
myPerson.Name = "Hank";
this._Service.SaveChangesAsync();
}
}
服务类
public Service {
private readonly DbContext _Context;
public Service(DbContext context){ //instantiated via Dependency Injection
this._Context = context;
}
public Task<PersonEntity> CreateNewPerson() {
PersonEntity toReturn = new PersonEntity() {
Name = "Jeff"
};
this._Context.People.Add(toReturn);
return toReturn;
}
public Task SaveChangesAsync(){
// Will the PersonEntity.Name be updated to 'Hank'?
await this._Context.SaveChangesAsync();
}
}
是的,它应该检测到更改。
它在后台的工作方式是,当您从上下文加载实体时,上下文(实际上是附加到上下文的DbChangeTracker
,具体来说)将拍摄实体的快照。 调用SaveChanges
时,上下文将扫描实体图并将其与快照进行比较,以查找更改的内容。 基于此,无论更改发生在何处或如何发生,上下文都应该看到更改。
这就是为什么当您不打算更新检索的实体时,使用 .AsNoTracking
很重要的原因。 它可以防止上下文拍摄快照,从而提高内存使用率和性能。
是的,它应该自动检测更改。
简短的回答:是的。
长答案:如果在调用SaveChanges()
之前未释放上下文,则在实体对象中进行更改后,它应该直接检测更改。但是,如果上下文不同,则可能需要在调用 SaveChanges()
之前附加对象(以将其放入上下文中)。