Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом - PullRequest
52 голосов
/ 15 апреля 2011

У меня есть следующий код для добавления или обновления объекта Entity.поиск объекта по первичному ключу на основе ответа, который я добавляю или обновляю.

Добавление записи работает, но при обновлении выдает это сообщение об ошибке " Объект с таким же ключом уже существует вObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом "

В моей базе данных MSSQL у меня есть только одна запись.

var v = db.Envelopes.Find(model.ReportDate, model.Service);
if (v == null)
{
    db.Envelopes.Add(model);
    db.SaveChanges();
    ViewBag.status = "Record Add successfully";
    ModelState.Clear();
}
else
{
    db.Entry(model).State = EntityState.Modified;
    db.SaveChanges();
}

Как я могу исправить это сообщение об ошибке?

Ответы [ 6 ]

88 голосов
/ 15 апреля 2011

Как уже упоминалось @anon, вы не можете прикрепить модель после загрузки объекта с тем же ключом.Изменения должны быть применены к присоединенному объекту.Вместо этого:

db.Entry(model).State = EntityState.Modified;

используйте это:

db.Entry(v).CurrentValues.SetValues(model);
9 голосов
/ 16 апреля 2011

Если более ранний запрос считывал сущность, подлежащую обновлению, и поэтому вы получаете сообщение об ошибке, вы можете изменить этот запрос на AsNoTracking. Смотрите пример AsNoTracking в: http://www.asp.net/entity-framework/tutorials/advanced-entity-framework-scenarios-for-an-mvc-web-application

7 голосов
/ 15 апреля 2011

Я предполагаю, что вы говорите, что ваша ошибка происходит здесь:

db.Entry(model).State = EntityState.Modified;

Как только вы выполните Find (), ваш конверт уже отслеживается вашим контекстом. Это означает, что если вам нужно изменить свойство, просто измените его на v, а затем вызовите SaveChanges (). Не беспокойтесь о настройке состояния на Modified.

5 голосов
/ 19 февраля 2013

Если вы установите для своего контекста значение AsNoTracking (), это остановит aspmvc, отслеживая изменения в сущности в памяти (что в любом случае вам нужно в сети).Не забудьте использовать оператор.

using System.Data.Entity;

db.Envelopes.AsNoTracking().Find(model.ReportDate, model.Service);

Я получил это из этого сообщения на форуме -> http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application

3 голосов
/ 07 июня 2012

Я использую это, потому что я уже создал новый экземпляр и заполнил свойства, которые мне нужно обновить.

var key=this.CreateEntityKey("Envelopes",model); 
        ObjectStateEntry ose;
        if(this.ObjectStateManager.TryGetObjectStateEntry(key, out ose)){
            var entity=(Page)ose.Entity;
            Envelopes.Detach(entity);
        }
            this.Envelopes.Attach(model);
0 голосов
/ 13 июля 2017

И еще один подход к решению проблемы - отсоединение отслеживаемой сущности и повторное присоединение модифицированной .Смотрите мое решение здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...