Вопрос по c#, .net, entity-framework – InvalidOperationException при вызове SaveChanges в .NET Entity Framework

14

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

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

<code>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();
}
</code>

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

The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.

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

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

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

Ответом для меня было установитьStoreGeneratedPattern="Identity" на имущество,see here for more details. m.edmondson
Также это происходит, когда вы используете сопоставления SotredProcedure для INSERT, UPDATE, DELETE, а ваш ключ ID является вычисляемым ключом внутри SP. Hamed Zakery Miab

Ваш Ответ

8   ответов
10

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

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

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

7

и я сказал, что он работает нормально

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

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

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

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

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2
System.Data.Objects.SaveOptions.None

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

0

Является ли личность & quot; свойство для другого столбца, чтобы "да" и вы вставляете дублированные значения в него.

1

вы должны вызвать suspendbinding:

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

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

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

Error: User Rate Limit ExceededHow to write good answer
6

что у вас есть равные значения в нескольких строках столбца 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>
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

если да, то создайте их и выполните «UpdateModel from Database».

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

Похожие вопросы