Ошибка: «На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker» - PullRequest
2 голосов
/ 14 апреля 2010

В настоящее время я использую шаблон репозитория в проекте 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 находятся в отношении 1-ко-многим, соответственно. Я перепробовал все, от отсоединения до создания совершенно нового контекста, как в приведенном выше примере кода, и не смог получить объект для сохранения. Когда я пытаюсь отсоединить его, он в основном говорит, что его нет в ObjectStateManager, который я интерпретирую как нечего отсоединять, что, если это правда, кажется, противоречит исходной ошибке. Я не уверен, что происходит, любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

@ Крейг, спасибо, я уже посмотрел эти ссылки и их решения и попытался реализовать их безуспешно.

Следующая ссылка предоставила мне решение моей проблемы, а также содержит другую очень полезную информацию о других разных проблемах, связанных с Entity Framework.

Entity Framework Gotchas

0 голосов
/ 16 декабря 2014

Я новичок в работе с MVC и Entity. У меня такая же проблема после многих боев Это решение сработало для меня. Надеюсь, это может быть полезно для вас, ребята.

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

Потому что вы читаете весь объект из базы данных и удерживаете его в текущем контексте, и когда вы пытаетесь изменить состояние объекта, он сообщает вам, что один объект уже присоединен к текущему контексту. просто позвоните сохранить изменения, он сохранит его.

...