InvalidOperationException при вызове SaveChanges в .NET Entity Framework - PullRequest
14 голосов
/ 17 июня 2009

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

Это код, который я использую

private void AddMovies(DirectoryInfo dir)
{
    MovieEntities db = new MovieEntities();
    foreach (DirectoryInfo d in dir.GetDirectories())
    {
        Movie m = new Movie { Name = d.Name, Path = dir.FullName };
        db.AddToMovies(movie);
    }
    db.SaveChanges();
}

Когда я делаю это, я получаю исключение в db.SaveChanges (), которое читает.

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

Мне не удалось выяснить, что является причиной этой проблемы. Моя таблица базы данных содержит три столбца
Id int autoincrement
Имя нчар (255)
Путь nchar (255)

Обновление: Я проверил мой файл edmx и раздел SSDL имеет StoreGeneratedPattern = "Identity", как было предложено. Я также последовал за публикацией в блоге и попытался добавить ClientAutoGenerated = "true" и StoreGenerated = "true" в CSDL, как это предлагалось там. Это приводило к ошибкам компиляции (Ошибка 5: Атрибут «ClientAutoGenerated» не допускается.). Поскольку сообщение в блоге с 2006 года содержит ссылку на последующее сообщение, я предполагаю, что оно было изменено.

Однако я не могу прочитать последующее сообщение, так как для него требуется учетная запись msdn.

Ответы [ 8 ]

10 голосов
/ 18 июня 2009

Я нашел решение для этого.

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

Я вернулся и исправил свою таблицу базы данных, но у меня все еще было странное исключение. В итоге проблема была решена путем удаления сущности и ее повторного создания после исправления таблицы.

Нет больше исключений:)

7 голосов
/ 16 марта 2010

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

bs.SuspendBinding();
Data.SaveChanges();
bs.ResumeBinding();

Важные вещи, о которых я хочу рассказать вам сегодня:

1 - если мы используем вышеприведенный код для приостановки привязки, нам нужно сделать больше кода, чтобы исправить множество сценариев, таких как потерянный индекс в коллекциях и привязки основной детали

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

        Data.SaveChanges(System.Data.Objects.SaveOptions.None);

Я надеюсь, что это решит ваши подобные проблемы

спасибо, друзья

6 голосов
/ 17 июня 2009

Это исключение говорит о том, что у вас есть равные значения в нескольких строках столбца Id, который должен иметь только уникальные значения, потому что это ключевой столбец. Entity Framework может обрабатывать такие столбцы двумя способами: либо вы (клиент) генерируете уникальные значения, либо сервер генерирует уникальные значения. В вашем случае кажется логичным разрешить Серверу генерировать автоинкрементные ключи.

У вас есть ключ StoreGeneratedPattern для столбца Id в вашем файле SSDL?

Вот пример из этого блога :

<EntityType Name="rooms" Key="id">
    <Property Name="id" Type="int" Nullable="false" 
              StoreGeneratedPattern="Identity" />
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" />
</EntityType>
2 голосов
/ 19 января 2011
System.Data.Objects.SaveOptions.None

Это решает проблему, но мне интересно, в чем разница между uning none или другими вариантами.

1 голос
/ 24 сентября 2009

если у вас есть привязка к источнику привязки, вам следует вызвать suspendbinding:

        bs.SuspendBinding();
        Data.SaveChanges();
        bs.ResumeBinding();
0 голосов
/ 10 июня 2014

У меня была похожая проблема с связью таблиц, охватывающей три уровня, такие как Customer-> Order-> Order-Details с oracle 12C Auto-ID Trigger для генерации ключа. Вставка с использованием SaveChanges() выбрасывала System.InvalidOperationException.

Решение: Расширяющая функция SaveChanges(System.Data.Objects.SaveOptions.None) предотвращает использование системой временного EntityKeys в состоянии графа объектов и исключает исключение результатов.

0 голосов
/ 16 апреля 2012

Также проверьте, если вы установили для свойства «Is Identity» для другого столбца значение «yes» и вставляете в него дублированные значения.

0 голосов
/ 13 марта 2012

Проверьте, отсутствуют ли первичные ключи в какой-либо из ваших политик, если да, то создайте их и выполните «UpdateModel from Database»

это должно решить проблему

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