objectstatemanager中已存在具有相同键的对象

时间:2012-11-09 16:07:43

标签: asp.net-mvc-3 entity-framework objectstatemanager

关于这个错误的很多问题,但我无法弄清楚我的问题(也许我需要更多关于此的理论)。

我开始使用“objectstatemanager中已经存在相同键的对象”错误,我想要做的事情就是这么简单,我只有一个客户端的编辑视图,它有一个电话列表。当用户点击“保存”按钮时,我只需用Json包装所有内容并使用Ajax将其发送到控制器。

在控制器上,我应该检查列表中发送的哪些电话我应该更新,插入新闻并删除。

所以这里是代码的重要部分(以及抛出提到的异常的代码):

            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.

更新:

我设法解决部分问题,以另一种形式重写上述例程,如下所示:

                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();

现在唯一的问题是删除一个Proprietario实例(因为它有一个TelefoneProprietario列表,而TelefoneProprietario有一个引用回到它所拥有的Proprietario。这个cenario导致“两个对象之间的关系无法定义,因为它们附加到不同的ObjectContext对象“正如在SO中广泛讨论的那样......试图找出解决方案,所以如果你能指出我的话......”

1 个答案:

答案 0 :(得分:1)

执行此操作时:db.Entry(tel).State = EntityState.Modified;

tel 对象只是您传入的对象模型,对吗?

因此,此时的EF上下文不跟踪具有相同密钥的任何对象 tel's key ,在这种情况下 IDTelefoneProprietario < / p>

因此,如果将对象状态设置为Modified,则 SaveChanges() EF将抛出错误。

请改为:

if (telToEdit != null)
{
    // Do apply all the changes from 'tel' to 'telToEdit' object here
    ...
    db.Entry(telToEdit).State = EntityState.Modified; // No Exception I hope :)
}

希望它有意义。