EF会识别在服务范围之外更改的实体的更改吗?

时间:2016-02-02 17:26:18

标签: c# entity-framework

给定ServiceHelper类,如果在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();
    }
}

3 个答案:

答案 0 :(得分:1)

是的,它应该会自动检测到这些变化。

答案 1 :(得分:1)

是的,它应该检测到这些变化。

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

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

答案 2 :(得分:0)

简短回答:是的。

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