У меня есть таблица в SQLite, которая выглядит следующим образом:
CREATE TABLE "LastSyncTime"
(
`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
`SyncTime` TEXT NOT NULL,
`TableUpdated` TEXT NOT NULL
)
Я использую команду:
Scaffold-DbContext "DataSource=MyApp.sqlite;" Microsoft.EntityFrameworkCore.Sqlite -OutputDir Models -force
для генерации DbContext
и моделей классов.
В пределах MyAppContext.cs
соответствующая таблица генерируется как:
modelBuilder.Entity<LastSyncTime>(entity =>
{
entity.HasIndex(e => e.Id)
.IsUnique();
entity.Property(e => e.Id)
.HasColumnName("ID")
.ValueGeneratedNever();
entity.Property(e => e.SyncTime).IsRequired();
entity.Property(e => e.TableUpdated).IsRequired();
});
Проблема связана с .ValueGeneratedNever()
, так как аннотация не позволяет Entity Framwork Core использовать БД для назначения идентификаторов вновь создаваемым записям.
В результате, начиная с пустой таблицы, если я это сделаю:
db.LastSyncTime.Add(new LastSyncTime
{
SyncTime = DateTime.Now.ToString("o"),
TableUpdated = "TableName1"
});
db.LastSyncTime.Add(new LastSyncTime
{
SyncTime = DateTime.Now.ToString("o"),
TableUpdated = "TableName2"
});
Выдает исключение на втором Add()
, поскольку обе записи были созданы с ID
, равным 0, что нарушает ограничение UNIQUE
.
Для получения нужного мне поведения - когда каждая новая запись будет автоматически получать идентификатор, назначенный базой данных, - необходимо изменить контекст, чтобы заменить ValueGeneratedNever()
на ValueGeneratedOnAdd()
.
Я пытался сохранить свой рабочий процесс с EF Core как можно ближе к тому, который я использовал в течение многих лет с исходной платформой Entity Framework, и я перегенерирую классы контекста и модели каждый раз, когда я вносил изменения в базу данных.
Есть ли способ изменить способ, которым Scaffold-DbContext
генерирует модель, или я могу либо вручную исправить DbContext
после каждого его обновления, либо полностью принять другой рабочий процесс с EFCore. например, сначала код, а не база данных.
Я работаю в UWP, поэтому я не могу просто переключиться на исходную версию Entity Framework.