[英]error when updating the same item 2 times
我有以下代碼,我從前端收到一個不完整的實體,進行更改並更新它。 之后,我從數據庫中檢索相同的實體,現在已經完成,進行新的更改並再次更新它......(業務規則已被刪除以便更好地理解。)
`
public async Task<SeparationRequest> CollectSignature(SeparationRequest separationRequest)
{
await base.UpdateAsync(separationRequest);
int IdSeparationRequestAux = separationRequest.Id;
separationRequest = null;
var newSeparationRequest = await GetByIdAsync(IdSeparationRequestAux);
await base.UpdateAsync(newSeparationRequest );
return newSeparationRequest;
}
`
這是 UpdateAsync 方法:`
public virtual async Task<TEntity> UpdateAsync(TEntity entity)
{
Repository.Update(entity);
await _unitOfWork.SaveChangesAsync();
return entity;
}
`
這是 GetByIdASync 方法:`
public override async Task<SeparationRequest> GetByIdAsync(object id)
{
var apps = await Repository.GetFirstOrDefaultAsync(predicate: x => x.Id == (int)id, disableTracking: true,
include: x => x.AsNoTracking().Include(x => x.SeparationRequestStatus)
.Include(x => x.Itens)
.ThenInclude(x => x.SeparationRequestItemStatus));
return apps;
}
`
GetByIdAsync 方法調用以下方法:Get FirstOrDefaultAsync `
public virtual async Task<TEntity> GetFirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null,
bool disableTracking = true,
bool ignoreQueryFilters = false)
{
IQueryable<TEntity> query = _dbSet;
if (disableTracking)
{
query = query.AsNoTracking();
}
if (include != null)
{
query = include(query);
}
if (predicate != null)
{
query = query.Where(predicate);
}
if (ignoreQueryFilters)
{
query = query.IgnoreQueryFilters();
}
if (orderBy != null)
{
return await orderBy(query).FirstOrDefaultAsync();
}
else
{
return await query.FirstOrDefaultAsync();
}
}
`
第一個 updateAsync 成功執行,但是當遇到第二個 UpdateAsync 時,會觸發以下異常:
System.InvalidOperationException: '無法跟蹤實體類型 'SeparationRequest' 的實例,因為已跟蹤具有 {'Id'} 相同鍵值的另一個實例。 附加現有實體時,確保只附加一個具有給定鍵值的實體實例。 考慮使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”來查看沖突的鍵值。
有誰知道我能做什么? obs:我正在使用 AddScopped 和 AddTransient 我得到了同樣的錯誤
由於您的 DBContext 由多個請求共享,這意味着您正在編輯的實體已經被跟蹤。
這可能是因為您的存儲庫服務是 Singleton 而不是 Scoped,因此您的數據庫上下文在被拉出時被跟蹤的實體重新使用,然后放回數據庫上下文的同一實例。
使用范圍存儲庫代替 Singleton 存儲庫,這意味着將為每個請求創建一個新實例。 同樣,您還將擁有每個請求的數據庫上下文。
當您注冊您的服務時,它將使用services.AddSingleton<..>
將其更改為services.AddScoped<..> ,當您注入它時,您將根據請求獲得一個新實例,並且您的更新應該可以正常工作。
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.