0

オブジェクトの更新を担当する次のメソッドがあります:-

private TMSEntities tms = new TMSEntities();
//code goes here...    
public void InsertOrUpdateServer(TMSServer server, string username,long assetid)
    {
        // code goes here
        }
        else
        {
            var auditinfo = IntiateAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "EDIT").ActionID,
            tms.TechnologyTypes.SingleOrDefault(a => a.Name.ToUpper() == "Server").AssetTypeID,
            username, server.ServerID);
            server.IT360SiteID = resource.SITEID.Value;
            tms.Entry(server).State = EntityState.Modified;
            InsertOrUpdateAudit(auditinfo);
        }
    }

しかし、次のエラーが表示されます:-

tms.Entry(server).State = EntityState.Modified;

同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: 同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

ソース エラー:

追跡しているオブジェクトは 1 つだけですが、この問題を解決するにはどうすればよいですか?

更新 私は私の方法に以下を追加しました:-

tms.Entry(server).CurrentValues.SetValues(server);

それ以外の

tms.Entry(server).State = EntityState.Modified;

しかし、次の例外が発生しています:-

エンティティがコンテキストに存在しないため、タイプ 'TMSServer' のエンティティに対してメンバー 'CurrentValues' を呼び出すことはできません。エンティティをコンテキストに追加するには、DbSet の Add メソッドまたは Attach メソッドを呼び出します。

2 番目の更新:-

public Audit IntiateAudit(int actionId, int assettypeID, string username, int? technologyID)
        {


            TechnologyAudit ta = new TechnologyAudit();
            ta.ActionID = actionId;
            ta.AssetTypeID = assettypeID;  
            ta.DateTimeStart = DateTime.Now;
            ta.UserName = username;
            if (technologyID != null)
            {
                ta.TechnologyID = technologyID.Value;
            }

            return ta;


        }

&

public void InsertOrUpdateAudit(Audit ta)
        {
            if (ta.ID == default(int))
            {
                // New entity
                ta.DateTimeEnd = DateTime.Now;
                tms.TechnologyAudits.Add(ta);

            }
            else
            {
                // Existing entity
                tms.Entry(ta).State = EntityState.Modified;
            }

&

public partial class TechnologyType
    {
        public TechnologyType()
        {
            this.SecurityroleTypePermisions = new HashSet<SecurityroleTypePermision>();
            this.Technologies = new HashSet<Technology>();
            this.TechnologyAudits = new HashSet<TechnologyAudit>();
        }

        public int AssetTypeID { get; set; }
        public string Name { get; set; }

        public virtual ICollection<SecurityroleTypePermision> SecurityroleTypePermisions { get; set; }
        public virtual ICollection<Technology> Technologies { get; set; }
        public virtual ICollection<TechnologyAudit> TechnologyAudits { get; set; }
    }

&

public partial class TMSServer
    {
        public TMSServer()
        {
            this.TMSServers1 = new HashSet<TMSServer>();
            this.TMSVirtualMachines = new HashSet<TMSVirtualMachine>();
        }

        public int TMSServerID { get; set; }
        public Nullable<int> ServerModelID { get; set; }
        public int DataCenterID { get; set; }
        public string ILOIP { get; set; }
        public int RackID { get; set; }
        public Nullable<int> StatusID { get; set; }
        public Nullable<int> BackUpStatusID { get; set; }
        public int RoleID { get; set; }
        public Nullable<int> OperatingSystemID { get; set; }
        public Nullable<int> VirtualCenterID { get; set; }
        public string Comment { get; set; }
        public byte[] timestamp { get; set; }
        public long IT360SiteID { get; set; }

        public virtual DataCenter DataCenter { get; set; }
        public virtual OperatingSystem OperatingSystem { get; set; }
        public virtual ServerModel ServerModel { get; set; }
        public virtual Technology Technology { get; set; }
        public virtual TechnologyBackUpStatu TechnologyBackUpStatu { get; set; }
        public virtual TechnologyRole TechnologyRole { get; set; }
        public virtual TechnologyStatu TechnologyStatu { get; set; }
        public virtual TMSRack TMSRack { get; set; }
        public virtual ICollection<TMSServer> TMSServers1 { get; set; }
        public virtual TMSServer TMSServer1 { get; set; }
        public virtual ICollection<TMSVirtualMachine> TMSVirtualMachines { get; set; }
    }
}        }

3 回目の更新

監査コードは次のとおりです:-

 public TechnologyAudit IntiateTechnologyAudit(int actionId, int assettypeID, string username, int? technologyID)
        {


            TechnologyAudit ta = new TechnologyAudit();
            ta.ActionID = actionId;
            ta.AssetTypeID = assettypeID;  
            ta.DateTimeStart = DateTime.Now;
            ta.UserName = username;
            if (technologyID != null)
            {
                ta.TechnologyID = technologyID.Value;
            }

            return ta;


        }
        public void InsertOrUpdateTechnologyAudit(TechnologyAudit ta)
        {
            if (ta.ID == default(int))
            {
                // New entity
                ta.DateTimeEnd = DateTime.Now;
                tms.TechnologyAudits.Add(ta);

            }
            else
            {
                // Existing entity
                tms.Entry(ta).State = EntityState.Modified;
            }
        }
4

0 に答える 0