【发布时间】:2020-09-27 23:19:17
【问题描述】:
当我插入一个实体后,直接尝试更新同一个实体,如下:
var insertedTransferId = await _transferDs.Create_Async(transferObject);
//update transfer key
if (insertedTransferId > 0)
{
transferObject.TransferKey = $"{transferObject.TransferKey}00{insertedTransferId}";
return await _transferDs.Update_Async(transferObject, true);
}
_transferDS Create_Async(TransferModel 模型)
public async Task<int> Create_Async(TransferModel model)
{
try
{
var entity = _mapper.Map<Transfer>(model);
this._repo.Create<Transfer>(entity);
this._repo.Context.Entry(entity).Reference(nameof(entity.TransferMeta)).IsModified = false;
var success = await _repo.SaveAsync() > 0 ? true : false;
if (success)
await this.UpdateTransferByTransferId(entity.TransferId);
return success ? entity.TransferId : 0;
}
catch
{
throw;
}
}
_repo.Create(实体)
public virtual void Create<TEntity>(TEntity entity)
where TEntity : class
{
Context.Set<TEntity>().Add(entity);
}
我遇到了以下问题:
无法跟踪实体类型“Transfer”的实例,因为已在跟踪具有相同键值的另一个实例
在初始插入之后,EntityState 是 Added。当我更新实体时,它抱怨实体已被跟踪。
我认为,在 .Net Core DI() 的帮助下,我可以使用 Transient 的 Lifetime 范围注入我的上下文、服务等,这意味着,每当我请求时,例如,我的上下文,一个新的将提供实例,ChangeTracker 将是干净的。不是这样的。
您可以在下面看到,我正在设置上下文的生命周期以及服务:
//Database context and repository
services.AddDbContext<IMyContext, MyContext>(builder =>
{
builder.UseSqlServer(connectionString: Configuration.GetConnectionString("myConnection"), sqlServerOptionsAction: null);
builder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
//builder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
builder.EnableSensitiveDataLogging(true);
}, ServiceLifetime.Transient);
services.AddTransient<IRepo, Repo>();
我是错过了什么,还是不明白什么?
【问题讨论】:
标签: .net entity-framework asp.net-core entity-framework-core ef-core-3.1