Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 Core 3中添加/更新/删除实体后如何取消附加/不跟踪实体_C#_Entity Framework_Entity Framework 6_Entity Framework Core - Fatal编程技术网

C# 在EF Core 3中添加/更新/删除实体后如何取消附加/不跟踪实体

C# 在EF Core 3中添加/更新/删除实体后如何取消附加/不跟踪实体,c#,entity-framework,entity-framework-6,entity-framework-core,C#,Entity Framework,Entity Framework 6,Entity Framework Core,在我们的项目中,我们使用EF Core 3.1,因为它是作为POCO生成的实体,所以我们使用这些POCO作为模型,用于控制器、BAL和DAL(DAL是工作单元和响应单元)。 在启动文件中的DB上下文注册期间,我们已将DB上下文标记为不可跟踪 services.AddDbContext<DBContext>(options => options.UseSqlServer(ConfigurationHandler.AppSettings.DBConnecti

在我们的项目中,我们使用EF Core 3.1,因为它是作为POCO生成的实体,所以我们使用这些POCO作为模型,用于控制器、BAL和DAL(DAL是工作单元和响应单元)。 在启动文件中的DB上下文注册期间,我们已将DB上下文标记为不可跟踪

services.AddDbContext<DBContext>(options =>
            options.UseSqlServer(ConfigurationHandler.AppSettings.DBConnection).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
在上面的方法名中,保存在DB中的值是“在存储库更新方法之后修改实体”,但我们只希望它是“使用存储库方法更新”。所以,如果我们调用update方法,那么这个模型(Student)就不应该是可跟踪的

services.AddDbContext<DBContext>(options =>
            options.UseSqlServer(ConfigurationHandler.AppSettings.DBConnection).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
存储库中更新方法的实现

 public virtual void Update(TEntity entity)
    {
       DbContext.Entry(entity).State = EntityState.Modified;
    }
在工作单元中提交方法实现:

public async Task<bool> CommitAsync()
    {
        try
        {
            await DbContext.SaveChangesAsync();
            return true;
        }
    }
public异步任务CommitAsync()
{
尝试
{
等待DbContext.saveChangesSync();
返回true;
}
}

工作单元是DbContext本身。存储库就是数据库集本身<代码>保存更改同步实际上会保留更改。调用此函数之前,不会向数据库发送任何内容。您的代码以一种不寻常的方式使用“通用存储库”反模式,例如,
Update
不更新任何内容,它附加了一个分离的实体。检查Gunnar Peipman的解决方案是放弃通用存储库。您必须一直跟踪实体,直到调用
SaveChanges
。您不需要(实际上不应该)将DbContext保留超过必要的时间。只需使用
AddDbContext
即可确保您拥有一个请求范围的“域事务”-如果您在最后调用
SaveChanges
,则所有内容都将被保存。否则,一切都将被丢弃。您不需要任何额外的东西。在您的代码中,甚至不需要使用
Update
方法-设置
Name
属性可以提前标记要更新的对象(假设
GetEntityAsync
不会执行分离对象或使用
AsNoTracking
)之类的奇怪操作。“工作单元是DBContext本身”我会回来的。是的,我们使用的是无跟踪,我在第一行代码中提到了这一点。