有关此错误的很多问题,但我无法弄清我的问题(也许我需要更多关于此的理论)。ObjectStatemanager中已存在具有相同密钥的对象
我开始“对象具有相同的密钥已存在objectStatemanager”错误,而即时尝试做的是如此简单,我只是有一个编辑视图的客户端,其中有一个电话列表。当用户点击保存按钮时,我只是用Json包装所有东西,然后用Ajax将它发送给控制器。
在控制器上,我应该检查我发送的清单上的哪些电话应该更新,插入为新闻并删除。
因此,这里的代码(即抛出提到exeception之一)的重要组成部分:
if (ModelState.IsValid)
{
foreach (var tel in propModel.Proprietario.Telefones)
{
//Updates
TelefoneProprietario telToEdit = null;
if (tel.IDTelefoneProprietario.HasValue)
telToEdit = db.TelefonesProprietarios.Find(tel.IDTelefoneProprietario);
if (telToEdit != null)
{
db.Entry(tel).State = EntityState.Modified; << Exception HERE!!!
}
else
{
//Inserts
db.TelefonesProprietarios.Add(tel);
}
}
if (propModel.Proprietario.IDProprietario.HasValue)
{
var prop = db.Proprietarios.Find(propModel.Proprietario.IDProprietario);
prop.LoadLists();
foreach (var telDel in prop.Telefones)
{
//Deletes
if (propModel.Proprietario.Telefones.Find(t => t.IDTelefoneProprietario == telDel.IDTelefoneProprietario) == null)
{
db.TelefonesProprietarios.Remove(telDel);
}
}
}
db.Entry(propModel.Proprietario).State = EntityState.Modified;
db.SaveChanges();
return Json(new { Success = 1, IDProprietario = propModel.Proprietario.IDProprietario, ex = "" });
}
任何帮助或建议?
,并使其更坏:我把线抛出异常时,只是为了测试代码的其余部分,并在调用SaveChanges之前的最后一行,它抛出另一个异常:
The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
UPDATE:
我设法解决这个问题的另一种形式重新编写上述日常工作的一部分,就像这样:现在
if (prop.IDProprietario.HasValue)
{
//Separete updates/inserts from deletes
List<int?> dbTels = db.TelefonesProprietarios
.Where(dt => dt.IDProprietario == prop.IDProprietario)
.Select(dt => dt.IDTelefoneProprietario)
.ToList();
List<int?> postedTels = prop.Telefones
.Select(pt => pt.IDTelefoneProprietario)
.ToList();
List<int?> deletedTels = dbTels
.Except(postedTels).ToList();
//Perform deletes
foreach (var delTelId in deletedTels)
{
if (delTelId.HasValue)
{
TelefoneProprietario delTel = db.TelefonesProprietarios
.Where(dt => dt.IDProprietario == prop.IDProprietario && dt.IDTelefoneProprietario == delTelId)
.Single();
db.Entry(delTel).State = EntityState.Deleted;
}
}
//Perform insert and updates
foreach (var tel in prop.Telefones)
{
if (tel.IDTelefoneProprietario.HasValue)
{
db.Entry(tel).State = EntityState.Modified;
}
else
{
db.Entry(tel).State = EntityState.Added;
tel.IDProprietario = (int)prop.IDProprietario;
}
}
db.Entry(prop).State = EntityState.Modified;
}
else
{
db.Proprietarios.Add(prop);
}
db.SaveChanges();
唯一的问题只剩下用于删除临prietario实例(因为它有一个TelefoneProprietario列表,而TelefoneProprietario有一个参照它的拥有者的Proprietario。这个内容会导致“这两个对象之间的关系不能被定义,因为它们被附加到不同的ObjectContext对象上”,正如这里所讨论的那样...试图找出一个解决方案,所以如果你能指点我一些东西......)
是的,它使得感觉。不幸的是,我仍然有一些问题来了解EF漏洞(以及它的工作原理)。在这一点上(和你告诉我的同步),我重新编写了洞方法。现在,它就像我刚才在问题(上面)上粘贴的那个,它正在工作。问题是在删除例程中(因为我的Proprietario类有一个TelefoneProprietario列表和一个TelefoneProprietario对Proprietario的引用,我得到了“两个对象之间的关系无法定义,因为它们连接到不同的ObjectContext对象”例外)... –