0

我想我根本没有得到这个上下文的东西......看看控制器的 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.

newPairPair是上面几行创建的类的新实例,并且db是在控制器级别创建的我的数据库上下文的实例,如下所示:

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

这里发生了什么?

4

1 回答 1

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 读取整个对象并将其保存在当前上下文中,当您尝试修改实体状态时,它会告诉您已经有一个实体附加到当前上下文。只需调用保存更改它就会保存它。

于 2014-12-16T11:12:41.897 回答