Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF是否会识别在服务之外更改的实体的更改';什么范围?_C#_Entity Framework - Fatal编程技术网

C# EF是否会识别在服务之外更改的实体的更改';什么范围?

C# EF是否会识别在服务之外更改的实体的更改';什么范围?,c#,entity-framework,C#,Entity Framework,给定一个服务和一个助手类,如果在服务中创建了一个对象,将其传递回调用的助手类,然后进行更改,如果调用SaveChanges(),实体框架会识别并应用更改吗 助手类 public MyHelper { private readonly Service _Service; private DoStuff(){ PersonEntity myPerson = this._Service.CreateNewPerson(); myPerson.Name =

给定一个
服务
和一个
助手
类,如果在
服务
中创建了一个对象,将其传递回调用的
助手
类,然后进行更改,如果调用
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();
    }
}
服务等级

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();
    }
}
公共服务{
私有只读DbContext\u Context;
公共服务(DbContext上下文){//通过依赖项注入实例化
这._Context=Context;
}
公共任务CreateNewPerson(){
PersonEntity toReturn=新的PersonEntity(){
Name=“杰夫”
};
此._Context.People.Add(toReturn);
回归回归;
}
公共任务saveChangesSync(){
//PersonEntity.Name是否会更新为“Hank”?
等待此消息。_Context.savechangesync();
}
}

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

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

简短回答:是

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


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

是,它应该检测到更改

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


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

是的,它应该检测到更改

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


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

此时只有记事本:(在调用savechanges时,EF将镜像上下文中的所有实体。因此,当您的对象在上下文中且其entitystate已添加或修改时,更改将写入db。此时只有记事本:(在调用savechanges时,EF将镜像上下文中的所有实体。因此,当您的对象在上下文中并且其entitystate被添加或修改时,更改将写入db。这正是我想听到的!谢谢,伙计。是否愿意详细说明其工作原理?您必须了解更改跟踪器:正是我想听到的!谢谢,伙计。是否愿意要详细说明它是如何工作的?您必须了解更改跟踪程序:作为参考,AsNoTracking的语法如下:
DbContextInstance.Set().AsNoTracking();
@LeviFuller,它实际上会关闭整个实体类型的更改跟踪(我甚至不知道您可以这样做)。如果要为单个查询禁用它,它看起来像是
Context.SomeEntity.AsNoTracking
。或
Context.Configuration.AutoDetectChangesEnabled=false;
为整个上下文禁用它。值得注意的是;因此,不跟踪的单个对象的完整语法是:
SomeEntity myEntity=Context.SomeEntity.AsNoTracking().FirstOrDefault(entity=>entity.Id==someId);
作为参考,AsNoTracking的语法如下:
DbContextInstance.Set().AsNoTracking();
@LeviFuller实际上会关闭整个实体类型的更改跟踪(我甚至不知道您可以这样做)。如果要为单个查询禁用它,它看起来像是
Context.SomeEntity.AsNoTracking
。或
Context.Configuration.AutoDetectChangesEnabled=false;
为整个上下文禁用它。值得注意的是;因此,不跟踪的单个对象的完整语法是:
SomeEntity myEntity=Context.SomeEntity.AsNoTracking().FirstOrDefault(entity=>entity.Id==someId);