2009-06-17 5 views
14

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

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

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 может находиться в несогласованном состоянии. Внутреннее исключение message: AcceptChanges не может продолжить , потому что значения ключа объекта конфликтуют с другим объектом в объекте ObjectStateManager. Убедитесь, что значения ключа уникальны перед вызовом AcceptChanges.

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

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

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

+1

Ответ для меня заключался в том, чтобы установить «StoreGeneratedPattern =» Identity »на свойство, [подробнее см. Здесь] (http://www.matthewedmondson.info/2012/09/entity-framework-and. HTML). –

+0

Также это происходит, когда вы используете сопоставления SotredProcedure для INSERT, UPDATE, DELETE и вашего ID-ключа - это вычисленный ключ внутри SP. –

ответ

10

Я нашел решение этой проблемы.

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

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

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

6

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

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

Вот пример из this blogpost:

<EntityType Name="rooms" Key="id"> 
    <Property Name="id" Type="int" Nullable="false" 
       StoreGeneratedPattern="Identity" /> 
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" /> 
</EntityType> 
+0

В EF4 есть «Identity» вместо «identity» –

+1

@XMLforDummies: спасибо, я обновил ответ! –

+0

Спасибо! Эта проблема заставляла меня гать на прошлой неделе или около того. Однако мне пришлось вручную редактировать файл. При изменении в свойствах добавлена ​​отметка аннотации. – Htbaa

1

, если у вас есть BindingSource связаны, вы должны вызвать suspendbinding:

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

последний раз, когда я попытался следующий код, и я сказал, что это работает отлично

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

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

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

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

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

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

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

+0

Примечание: System.Data.Objects.SaveOptions.None доступен только в .Net 4.0. – sfuqua

+1

Это может быть только .Net 4.0, но SaveOptions.None отлично справился с этой проблемой. –

+0

что я использую в EF5 или 6? есть ли эквивалентная опция coz, я получаю подобную проблему? спасибо – lawphotog

2
System.Data.Objects.SaveOptions.None 

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

0

Проверьте Первичные ключи отсутствуют в любом из etities, если да, то создать их, и сделать «UpdateModel из базы данных»

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

0

Также убедитесь, что вы установили свойство «Идентификация» для другого столбца «да», и вы вставляете в него дублирующиеся значения.

0

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

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

+2

Это не ответ на вопрос. Если у вас есть аналогичная проблема, вы можете задать другой вопрос. См. [Как написать хороший ответ] (http://stackoverflow.com/help/how-to-answer) –

Смежные вопросы