给定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();
}
}
答案 0 :(得分:1)
是的,它应该会自动检测到这些变化。
答案 1 :(得分:1)
是的,它应该检测到这些变化。
它在幕后工作的方式是,当您从上下文加载实体时,上下文(实际上是附加到上下文的DbChangeTracker
)将是实体的快照。当您调用SaveChanges
时,上下文将扫描实体图并将其与快照进行比较,以查找更改的内容。基于此,无论变化发生在何处或如何发生,上下文都应该看到变化。
这就是为什么在不打算更新检索的实体时使用.AsNoTracking
非常重要的原因。它可以防止上下文拍摄快照,从而提高内存使用率和性能。
答案 2 :(得分:0)
简短回答:是的。
长答案:如果在调用SaveChanges()
之前未处理上下文,则在实体对象中进行更改后,应直接检测更改。但是,如果上下文不相同,那么在调用SaveChanges()
之前,您可能需要附加对象(将其放在上下文中)。