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();
    }
}

EF 是否会识别对超出服务范围的实体所做的更改

是的,它应该检测到更改。

它在后台的工作方式是,当您从上下文加载实体时,上下文(实际上是附加到上下文的DbChangeTracker,具体来说)将拍摄实体的快照。 调用SaveChanges时,上下文将扫描实体图并将其与快照进行比较,以查找更改的内容。 基于此,无论更改发生在何处或如何发生,上下文都应该看到更改。

这就是为什么当您不打算更新检索的实体时,使用 .AsNoTracking 很重要的原因。 它可以防止上下文拍摄快照,从而提高内存使用率和性能。

是的,它应该自动检测更改。

简短的回答:是的。

长答案:如果在调用SaveChanges()之前未释放上下文,则在实体对象中进行更改后,它应该直接检测更改。但是,如果上下文不同,则可能需要在调用 SaveChanges() 之前附加对象(以将其放入上下文中)。