簡體   English   中英

無法跟蹤實體類型的實例,因為已在跟蹤具有相同鍵值的另一個實例

[英]The instance of entity type cannot be tracked because another instance with the same key value is already being tracked

我從實體庫 class 獲得了相同的鍵值運行時異常。 我嘗試了一些沒有運氣的在線解決方案。 誰能幫我解決這個問題? 當我嘗試更新時,以下行拋出異常:

this.RepositoryContext.Set().Update(entity);

框架:.netcore 3.1

錯誤:

{“無法跟蹤實體類型'JobConnection'的實例,因為已經在跟蹤另一個具有與{'JobConnectionId'}鍵值相同的實例。附加現有實體時,請確保僅附加一個具有給定鍵值的實體實例. 考慮使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”來查看沖突的鍵值。”}。

這是電話:

public void UpdateJobConn(JobConnection jobfile)
        {
            Update(jobfile);
            Save();
        }

這是整個存儲庫 class:

using Foreside.Etp.Contracts;
using Foreside.Etp.Entities.Models;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Linq;

namespace Foreside.Etp.Repository
{
    public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class
    {
        protected EtpRepoContext RepositoryContext { get; set; }

        public RepositoryBase(EtpRepoContext repositoryContext)
        {
            this.RepositoryContext = repositoryContext;
        }

        public IEnumerable<T> FindAll()
        {
            return this.RepositoryContext.Set<T>();
        }

        public IEnumerable<T> FindByCondition(Expression<Func<T, bool>> expression)
        {
            return this.RepositoryContext.Set<T>().Where(expression);
        }

        public void Create(T entity)
        {
            this.RepositoryContext.Set<T>().Add(entity);
        }

        public void Update(T entity)
        {
            this.RepositoryContext.Set<T>().Update(entity);
        }

        public void Delete(T entity)
        {
            this.RepositoryContext.Set<T>().Remove(entity);
        }

        public void Save()
        {
            this.RepositoryContext.SaveChanges();
        }
    }
}

作業連接 Model -

public partial class JobConnection
    {
        public int JobConnectionId { get; set; }
        public int KeyId { get; set; }
        public int ConnectionId { get; set; }
        public string Directory { get; set; }
        public int JobId { get; set; }
        public int ConnectiontypeId { get; set; }
    }

語境 -

 public virtual DbSet<JobConnection> JobConnection { get; set; }

modelBuilder.Entity<JobConnection>(entity =>
        {
            entity.ToTable("job_connection");

            entity.HasKey(e => e.JobConnectionId);

            entity.Property(e => e.JobConnectionId)
                .HasColumnName("jobconnectionid")
                .HasColumnType("int(11)");

            entity.Property(e => e.ConnectionId)
                .HasColumnName("connectionid")
                .HasColumnType("int(11)")
                .HasDefaultValueSql("0");

            entity.Property(e => e.ConnectiontypeId)
                .HasColumnName("connectiontypeid")
                .HasColumnType("int(11)");

            entity.Property(e => e.Directory)
                .IsRequired()
                .HasColumnName("directory")
                .HasMaxLength(50)
                .IsUnicode(false)
                .HasDefaultValueSql("0");

            entity.Property(e => e.JobId)
                .HasColumnName("jobid")
                .HasColumnType("int(11)");

            entity.Property(e => e.KeyId)
                .HasColumnName("keyid")
                .HasColumnType("int(11)")
                .HasDefaultValueSql("0");
        });

桌子 -

SHOW INDEXES
FROM job_connection

job_connection  0   PRIMARY 1   jobconnectionid A   63              BTREE       

最后我通過分離 EntityState 解決了這個問題。 我非常感謝您分享您的想法 - 它有助於思考。 請在下面找到問題和正確的解決方案。

問題:

至少有一個孤立跟蹤實例阻止使用我想在 DB 中更新的正確實例 - 基本上這是一個重復的實例,當上下文試圖在 DB 中更新並且無法保存 JobConnection 的任何引用時,它會干擾. 即使在離開 scope 的聲明和初始化之后,上下文也以某種方式存儲了對插入對象的引用。

解決方案:

可以有多種方法來解決這個問題。 其中一種方法是將實例從上下文中分離出來,以避免類似的孤立重復實例導致我們的案例出現問題。 這是我如何在代碼中修復的示例:

_context.Entry<JobConnection>(jobCon).State = EntityState.Detached;  //Explicitly Detach the orphan tracked instance 

代碼中存在類似問題的另一個示例,這里是解決方案。

var inFiles = _filerepository.FindAllInboundFilesByJobId(job.Jobid);
foreach (File inFile in inFiles)
_context.Entry<File>(inFile).State = EntityState.Detached;

好像您沒有使用entity.HasKey(a => a.Id);類的東西表示主鍵。 因此,數據庫行 ID 與您嘗試更新的 memory 中的 object 沖突。

您應該在this.RepositoryContext.SaveChanges();之前調試並檢查您正在更新的 object 的 ID。 叫做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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