簡體   English   中英

更新同一項目 2 次時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM