Как настроить модель как первичный автоинкрементный ключ в EF Core с помощью Fluent API?

В проекте с ef core в модели использую в качестве первичного ключа объект, в котором содержится сам Id.

Пример модели:

 public class Catalog
{
    public Catalog()
    {
    }

    public CatalogId Id { get; set; }
    public string FullName { get; set; }
}

Пример класса первичного ключа:

public class CatalogId
{
    public int Id { get; }

    public CatalogId(int id)
    {
        Id = id;
    }
}

Настроил ef core так что он понимает как мапить объект:

        builder.Property(c => c.Id)
            .HasConversion(
                v => v.Id,
                v => new CatalogId(v))
            .IsRequired();

        builder.HasKey(c => c.Id);

Но при этом не получается записать данные в базу. Ругается что первичный ключ нулевой. Заглянул в базу, в таблице объект не создался как автоинкрементный, столбец создался как обычный первичный ключ.

Проверил миграции, для обычных моделей Id генерируется следующим образом:

Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1")

В моем случае с классом Catalogs, отсутствует Annotation("SqlServer:Identity", "1, 1"), добавление аннотации в миграцию вручную не помогло, т.к. в таком случае при вставке данных модели с Id = 0 Ef Core воспринимает как попытку вставить Id в автоинкрементное поле.

Как через Fluent Api настроить Ef Core так, чтобы поле было автоинкрементным первичным ключом?

P.S: Ef core версии 3.1.6

P.S.S.: Использовать аннотации по типу [DatabaseGenerated(DatabaseGeneratedOption.Identity)] не могу, класс в домене. Создать DTO и мапить доменную сущность в обычную, очень усложняет реализацию.


Ответы (0 шт):