Asp.net mvc ObjectStateManager错误中已存在具有相同密钥的对象。虽然我只追踪一个物体
尝试编辑对象时,我在asp.net mvc web应用程序中遇到以下错误:- ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙 编辑后操作方法为:-Asp.net mvc ObjectStateManager错误中已存在具有相同密钥的对象。虽然我只追踪一个物体,asp.net-mvc,linq,Asp.net Mvc,Linq,尝试编辑对象时,我在asp.net mvc web应用程序中遇到以下错误:- ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙 编辑后操作方法为:- [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(ServerJoin sj, FormCollection formValues) {
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ServerJoin sj, FormCollection formValues)
{
string controllername = RouteData.Values["controller"].ToString();
var databaseTechnology = repository.FindTechnology(sj.Server.RackID);
//code goes here
repository.InsertOrUpdateServer(sj.Server, User.Identity.Name, sj.Resource.RESOURCEID);
repository.Save();
return RedirectToAction("Details", new { id = sj.Server.TMSServerID });
//codegoes here
}
执行编辑并导致异常的存储库方法是:-
public void InsertOrUpdateServer(TMSServer server, string username,long assetid)
{
var resource = GetResourceDetials(assetid);
if (server.TMSServerID == default(int))
{
// New entity
//codegoes here
else
{
var auditinfo = IntiateTechnologyAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "EDIT").ID,
tms.TechnologyTypes.SingleOrDefault(a => a.Name.ToUpper() == "SERVER").AssetTypeID,
username, server.TMSServerID);
server.IT360SiteID = resource.SITEID.Value;
tms.Entry(server).State = EntityState.Modified;
InsertOrUpdateTechnologyAudit(auditinfo);
}
}
审计的报告方法为:-
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;
}
}
TMSServer的模型类为:-
public partial class TMSServer
{
public 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<TMSVirtualMachine> TMSVirtualMachines { get; set; }
}
公共部分类服务器
{
公共TMSServer()
{
this.TMSVirtualMachines=new HashSet();
}
公共int TMSServerID{get;set;}
公共可为空的ServerModelID{get;set;}
public int DataCenterID{get;set;}
公共字符串ILOIP{get;set;}
public int RackID{get;set;}
公共可为空的StatusID{get;set;}
公共可为空的BackUpStatusID{get;set;}
public int RoleID{get;set;}
公共可空操作系统ID{get;set;}
公共可为空的VirtualCenter ID{get;set;}
公共字符串注释{get;set;}
公共字节[]时间戳{get;set;}
公共长IT360SiteID{get;set;}
公共虚拟数据中心数据中心{get;set;}
公共虚拟操作系统操作系统{get;set;}
公共虚拟服务器模型服务器模型{get;set;}
公共虚拟技术技术{get;set;}
公共虚拟技术BackupStatu技术BackupStatu{get;set;}
公共虚拟技术yrole TechnologyRole{get;set;}
公共虚拟技术statu TechnologyStatu{get;set;}
公共虚拟TMSRack TMSRack{get;set;}
公共虚拟ICollection虚拟机{get;set;}
}
该技术的模型类别为:-
public partial class Technology
{
public Technology()
{
this.TMSSwitchPorts = new HashSet<TMSSwitchPort>();
this.TechnologyAudits = new HashSet<TechnologyAudit>();
this.TechnologyIPs = new HashSet<TechnologyIP>();
}
public int TechnologyID { get; set; }
public string Tag { get; set; }
public bool IsDeleted { get; set; }
public byte[] timestamp { get; set; }
public Nullable<int> TypeID { get; set; }
public Nullable<System.DateTime> StartDate { get; set; }
public Nullable<long> IT360ID { get; set; }
public virtual TMSFirewall TMSFirewall { get; set; }
public virtual TMSRack TMSRack { get; set; }
public virtual TMsRouter TMsRouter { get; set; }
public virtual TMSServer TMSServer { get; set; }
public virtual TMSStorageDevice TMSStorageDevice { get; set; }
public virtual TMSSwitch TMSSwitch { get; set; }
public virtual ICollection<TMSSwitchPort> TMSSwitchPorts { get; set; }
public virtual TechnologyType TechnologyType { get; set; }
public virtual ICollection<TechnologyAudit> TechnologyAudits { get; set; }
public virtual ICollection<TechnologyIP> TechnologyIPs { get; set; }
public virtual TMSVirtualMachine TMSVirtualMachine { get; set; }
}
公共部分类技术
{
公共技术()
{
this.tmswitchport=new HashSet();
this.TechnologyAudits=新的HashSet();
this.TechnologyIPs=new HashSet();
}
public int TechnologyID{get;set;}
公共字符串标记{get;set;}
公共布尔被删除{get;set;}
公共字节[]时间戳{get;set;}
公共可为空的TypeID{get;set;}
公共可为空的起始日期{get;set;}
公共可空IT360ID{get;set;}
公共虚拟防火墙TMSFirewall{get;set;}
公共虚拟TMSRack TMSRack{get;set;}
公共虚拟TMsRouter TMsRouter{get;set;}
公共虚拟TMSServer TMSServer{get;set;}
公共虚拟TMSStorageDevice TMSStorageDevice{get;set;}
公共虚拟TMSSwitch TMSSwitch{get;set;}
公共虚拟ICollection TMSSwitchPorts{get;set;}
公共虚拟技术类型技术类型{get;set;}
公共虚拟ICollection技术审核{get;set;}
公共虚拟ICollection技术Ips{get;set;}
公共虚拟TMSVirtualMachine TMSVirtualMachine{get;set;}
}
我在tms.Entry(server.State=EntityState.Modified)上得到错误代码>在InsertOrUpdateServer存储库方法中。知道是什么导致了这个异常吗?记住我只跟踪一个TMSServer对象
提前感谢您的帮助。您看到了吗:或者我不想开始添加额外的代码,我总是使用相同的方法编辑对象,效果很好。因此,我试图在我当前的代码中找出导致问题的原因,也许我可以找到一个更简单的解决方案…@DavidTansey,此外,两个示例都有不同的问题,因为它们跟踪多个对象,但在我的情况下,我只跟踪单个对象。。