【问题标题】:Error: “An entity object cannot be referenced by multiple instances of IEntityChangeTracker"错误:“IEntityChangeTracker 的多个实例无法引用实体对象”
【发布时间】:2010-04-14 17:02:16
【问题描述】:

我目前在一个 ASP.Net MVC 项目中使用存储库模式,并且有以下代码:

    partial class Timesheet : ITimesheet
        {
            TimeSystemDBEntities _db;

            public Timesheet()
            {
                _db = new TimeSystemDBEntities();
            }
            .
            .
             //More Methods
            .
            .

            //Save WorkWeek to database
            private void SaveWorkWeek(WorkWeek wk)
                {
                    //Creating a new test context in attempt to resolve
                    //Error: “An entity object cannot be referenced by multiple instances of IEntityChangeTracker"
                    var testContext = new TimeSystemDBEntities();
                    var newWorkWeek = new WorkWeek();
                    var newStudent = new Student();
                    //Copy contents of wk to newWorkWeek
                    newWorkWeek.Students = newStudent.GetStudent(wk.Students.id);
                    newWorkWeek.MonDate = wk.MonDate;
                    newWorkWeek.MonHours = wk.MonHours;
                    newWorkWeek.TuesDate = wk.TuesDate;
                    newWorkWeek.TuesHours = wk.TuesHours;
                    newWorkWeek.WedDate = wk.WedDate;
                    newWorkWeek.WedHours = wk.WedHours;
                    newWorkWeek.ThursDate = wk.ThursDate;
                    newWorkWeek.ThursHours = wk.ThursHours;
                    newWorkWeek.FriDate = wk.FriDate;
                    newWorkWeek.FriHours = wk.FriHours;
                    newWorkWeek.TempSave = wk.TempSave;

                    testContext.AddToWorkWeek(newWorkWeek); //Exception thrown here
                    testContext.SaveChanges();

                    //Also tried
                    //_db.AddToWorkWeek(newWorkWeek); //Exception thrown here
                    //_db.SaveChanges();

                    //Also tried
                    //_db.detach(wk): //Different exception thrown here: Says it's not in ObjectStateManager
                    //_db.AddToWorkWeek(newWorkWeek); 
                    //_db.SaveChanges();

                    //Also tried
                    //_db.detach(wk.Students): //Different exception thrown here: Says it's not in ObjectStateManager
                    //_db.AddToWorkWeek(newWorkWeek); 
                    //_db.SaveChanges();

                }

    }

Student 和 WorkWeek 类分别是一对多的关系。我已经尝试了从分离到创建全新上下文的所有方法,如上面的示例代码,但无法保存对象。当我尝试分离时,它基本上说它不在 ObjectStateManager 中,我将其解释为没有什么可分离的,如果为真,这似乎与原始错误相矛盾。我不确定发生了什么,感谢任何帮助。

【问题讨论】:

标签: asp.net-mvc entity-framework linq-to-entities ado.net-entity-data-model


【解决方案1】:

@Craig,谢谢我实际上已经查看了这些链接及其解决方案,并尝试实施它们但没有成功。

以下链接为我提供了问题的解决方案,还提供了有关与实体框架有关的其他杂项问题的其他非常有用的信息。

Entity Framework Gotchas

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多