Вот шаги:
- Создайте один объект в моем проекте, объект инициализируется с идентификатором = 0
- Создайте DbContext и добавьте объект в DbContext
- Позвонить SaveChanges(), и объект теперь имеет идентификатор = 1
- Если я использую браузер SQLite DB, я вижу, что объект хранится с идентификатором = 1< /code>
- Закройте приложение и перезапустите
- Загрузите файл проекта, и объект загрузится в приложение с идентификатором = 1 из базы данных
- Создать новый объект, который инициализируется с идентификатором = 0
- Создайте новый DbContext и добавьте исходный объект () и новый объект (
Код: Выделить всё
ID = 1
)Код: Выделить всё
ID = 0
- Вызов SaveChanges()
SqliteException: Ошибка SQLite 19: «Ограничение UNIQUE не выполнено: [Class].Id».
Объекты, с которыми возникла эта проблема, имеют идентификатор свойство определяется следующим образом:
Код: Выделить всё
public int Id { get; set; }
Вот код для создания одной из таблиц, в которой у меня возникла эта проблема:
Код: Выделить всё
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");
});
Мое приложение имеет список объектов, некоторые из которых могут уже храниться в базе данных, а некоторые только существуют в памяти. Цель моей функции save-project — обеспечить запись текущего состояния всех объектов приложения в базу данных. Таким образом, я просто добавлял все объекты, чтобы гарантировать, что DbManager знал о них.
Один комментатор, кажется, считает, что использование «Обновить» является признаком ошибочной логики. Как бы вы рекомендовали изменять поля объекта в базе данных, когда значения изменяются в памяти, кроме использования этой функции?
Конечно, я не пытаюсь «убедить» DbManager, что объект поступил из базы данных, хотя это не так. Я пытаюсь поместить состояние моего приложения в базу данных, причем часть этого состояния могла быть ранее загружена с использованием отдельного контекста DbManager, а часть состояния была создана в памяти с момента последней записи в базу данных.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -id-values