Подтвердить что ты не робот

InvalidOperationException при вызове SaveChanges в .NET Entity framework

Я пытаюсь узнать, как использовать инфраструктуру 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(), который читается.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Больше никаких исключений:)

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

Вот пример из этого 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>

Ответ 4

System.Data.Objects.SaveOptions.None

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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