Почему использование EF Core приводит к дублированию значений идентификаторов?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему использование EF Core приводит к дублированию значений идентификаторов?

Сообщение Anonymous »

Я использую EF Core (9.0.0) в качестве файла приложения/проекта с базой данных SQLite. У меня возникла проблема, из-за которой функция SaveChanges выдает исключение из-за повторяющихся значений идентификатора.
Вот шаги:
  • Создайте один объект в моем проекте, объект инициализируется с идентификатором = 0
  • Создайте DbContext и добавьте объект в DbContext
  • Позвонить SaveChanges(), и объект теперь имеет идентификатор = 1
  • Если я использую браузер SQLite DB, я вижу, что объект хранится с идентификатором = 1< /code>
  • Закройте приложение и перезапустите
  • Загрузите файл проекта, и объект загрузится в приложение с идентификатором = 1 из базы данных
  • Создать новый объект, который инициализируется с идентификатором = 0
  • Создайте новый DbContext и добавьте исходный объект () и новый объект ()
  • Вызов SaveChanges()
В этот момент я получаю исключение:

SqliteException: Ошибка SQLite 19: «Ограничение UNIQUE не выполнено: [Class].Id».

Объекты, с которыми возникла эта проблема, имеют идентификатор свойство определяется следующим образом:

Код: Выделить всё

public int Id { get; set; }
Как мне выполнить рефакторинг приложения, чтобы избежать конфликта идентификаторов? Я не уверен, как работает ответственность за управление и присвоение значений идентификаторов. Я думал, что могу просто игнорировать поля ID и настроить связи, позволяя EF полностью обрабатывать значения полей ID, но, похоже, я что-то упустил.
Вот код для создания одной из таблиц, в которой у меня возникла эта проблема:

Код: Выделить всё

migrationBuilder.CreateTable(
name: "LayoutElements",
columns: table => new
{
Id = table.Column(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DrawingDataId = table.Column(type: "INTEGER", nullable: true),
ElementType = table.Column(type: "INTEGER", nullable: false),
X = table.Column(type: "INTEGER", nullable: false),
Y = table.Column(type: "INTEGER", nullable: false),
BaseWidth = table.Column(type: "REAL", nullable: false),
BaseHeight = table.Column(type: "REAL", nullable: false),
Width = table.Column(type: "REAL", nullable: false),
Height = table.Column(type: "REAL", nullable: false),
ScaleX = table.Column(type: "REAL", nullable: false),
ScaleY = table.Column(type: "REAL", nullable: false),
Discriminator = table.Column(type: "TEXT", maxLength: 21, nullable: false),
OnDelayMs = table.Column(type: "INTEGER", nullable: true),
OffDelayMs = table.Column(type: "INTEGER", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_LayoutElements", x => x.Id);
table.ForeignKey(
name: "FK_LayoutElements_Drawings_DrawingDataId",
column: x => x.DrawingDataId,
principalTable: "Drawings",
principalColumn: "Id");
});
Первоначальная цель добавления как новых, так и старых объектов, насколько я понимаю, заключалась в том, чтобы DbManager знал об этих объектах; Я не осознавал, что «Добавить» означало «Добавить» в простом смысле вставки строки.
Мое приложение имеет список объектов, некоторые из которых могут уже храниться в базе данных, а некоторые только существуют в памяти. Цель моей функции save-project — обеспечить запись текущего состояния всех объектов приложения в базу данных. Таким образом, я просто добавлял все объекты, чтобы гарантировать, что DbManager знал о них.
Один комментатор, кажется, считает, что использование «Обновить» является признаком ошибочной логики. Как бы вы рекомендовали изменять поля объекта в базе данных, когда значения изменяются в памяти, кроме использования этой функции?
Конечно, я не пытаюсь «убедить» DbManager, что объект поступил из базы данных, хотя это не так. Я пытаюсь поместить состояние моего приложения в базу данных, причем часть этого состояния могла быть ранее загружена с использованием отдельного контекста DbManager, а часть состояния была создана в памяти с момента последней записи в базу данных.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -id-values
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»