错误:IEntityChangeTracker的多个实例无法引用实体对象

时间:2012-09-04 03:41:55

标签: entity-framework-4 asp.net-mvc-4

我根本没有得到这个上下文的东西...从控制器的Create动作看一下这个片段:

if (ModelState.IsValid)
{
    Individual target = db.Individuals.Where(i => i.ID == Target.ID).First();

    target.LocationId = Destination.ID;
    db.Entry(target).State = EntityState.Modified;
    db.SaveChanges();

    if (newPair != null)
    {
        db.Pairs.Add(newPair);
        db.SaveChanges();
    }
}

第一个SaveChanges();工作正常,记录在数据库中更新。但是在第二个.Add()之前的SaveChanges();行会导致错误An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

newPair是上面几行创建的Pair类的新实例,db是在控制器级创建的我的数据库上下文的实例,如:

public class MoveController : Controller
{
    private ShepherdContext db = new ShepherdContext();
......

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

我是MVC&的新手实体框架工作。经过多次战斗后,我遇到了同样的问题 这个解决方案对我有用。希望它对你们有用。

var mediaItem = db.MediaItems.FirstOrDefault(x => x.Id == mediaItemViewModel.Id);
    mediaItem.Name = mediaItemViewModel.Name;
    mediaItem.Description = mediaItemViewModel.Description;
    mediaItem.ModifiedDate = DateTime.Now;
    mediaItem.FileName = mediaItem.FileName;
    mediaItem.Size = KBToMBConversion(mediaItemViewModel.Size);
    mediaItem.Type = mediaItem.Type;

//db.Entry(mediaItem).State = EntityState.Modified;// coment This line
db.SaveChanges();

因为您正在从db读取整个对象并将其保存在当前上下文中,并且当您尝试修改实体状态时,它会告诉您已经有一个实体附加到当前上下文。只需调用保存更改就可以保存它。