Несогласованная ошибка состояния объекта в Entity Framework при сохранении - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть следующий код, чтобы симулировать владельца, продающего свою собаку кому-то другому, и собаку, получившую новое имя:

public void ChangeOwner(int oldOwnerID, int newOwnerID, int dogID, string newDogName)
{
    var oldOwner = _objectContext.People.FirstOrDefault(x => x.ID == oldOwnerID);
    oldOwner.DogID = null;

    var newOwner = _objectContext.People.FirstOrDefault(x => x.ID == newOwnerID);
    newOwner.DogID = dogID;

    var dog = _objectContext.Dogs.FirstOrDefault(x => x.ID == dogID);
    dog.Name = newDogName;

    _objectContext.SaveChanges();
}

Этот код выдаст следующую ошибку:

Дополнительная информация: изменения в базе данных были успешно зафиксированы, но при обновлении контекста объекта произошла ошибка. ObjectContext может быть в несовместимом состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager. Убедитесь, что значения ключей уникальны, прежде чем вызывать AcceptChanges.

Почему происходит эта ошибка и что я могу сделать, чтобы исправить ее?

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Можете ли вы взглянуть на определение / создание вашей таблицы и посмотреть, добавили ли вы первичный ключ или присвоили ли ему значение и присвоили ли свойству (Is Identity) значение yes

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

1 голос
/ 28 июня 2013

Я получил эту проблему сам, и приведенный выше ответ совершенно прав, говоря, что это проблема ПЕРВИЧНОГО КЛЮЧА, но, будучи новичком в ASP.NET MVC, я точно не знал, как реализовать решение.

Итак, для тех ASP.NET MVC n00bs, как я, которые хотели бы увидеть некоторый код и что сработало для меня:

Моя проблема заключалась в том, что ключ в моей модели не соответствовал ключу в таблице SQL.

Например. Мой ПЕРВИЧНЫЙ КЛЮЧ находится на «Event_Question_ID» в моей таблице. Но в моей МОДЕЛИ это было в другом поле, EventID.

Все, что мне нужно было сделать, это переместить КЛЮЧ в правильное поле в моей МОДЕЛИ

Модель:

[Key]   
public int Event_Question_ID { get; set; }

Примечание: [Key] требуется using System.ComponentModel.DataAnnotations;

Надеюсь, это кому-нибудь поможет!

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