Использование Entity Framework Core для генерации классов для таблицы sqlite с автоинкрементным первичным ключом - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...