C# 在EF Core 3中添加/更新/删除实体后如何取消附加/不跟踪实体
在我们的项目中,我们使用EF Core 3.1,因为它是作为POCO生成的实体,所以我们使用这些POCO作为模型,用于控制器、BAL和DAL(DAL是工作单元和响应单元)。 在启动文件中的DB上下文注册期间,我们已将DB上下文标记为不可跟踪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
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本身”我会回来的。是的,我们使用的是无跟踪,我在第一行代码中提到了这一点。