Автоматическое увеличение частичного первичного ключа с помощью ядра Entity Framework

asp.net c# entity-framework entity-framework-core postgresql

Вопрос

Я прокомментировал следующую модель с использованием API-интерфейса EF Core:

modelBuilder.Entity<Foo>()
    .HasKey(p => new { p.Name, p.Id });

Оба поля помечены как первичный ключ, когда я создаю базу данных в PostgreSQL, но поле Id не помечено как автоматическое приращение. Я также попытался добавить

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

в поле Id под Foo, без каких-либо различий в коде миграции. Есть ли способ сделать Id AI, хотя это PPK?

Принятый ответ

Ну, эти аннотации данных должны делать трюк, возможно, что-то связано с Поставщиком PostgreSQL.

Из документации EF Core :

В зависимости от используемого поставщика базы данных значения могут генерироваться клиентской стороной EF или в базе данных. Если значение генерируется базой данных, тогда EF может назначить временное значение при добавлении объекта в контекст. Это временное значение затем будет заменено значением, генерируемым базой данных во время SaveChanges .

Вы также можете попробовать эту конфигурацию Fluent Api:

modelBuilder.Entity<Foo>()
            .Property(f => f.Id)
            .ValueGeneratedOnAdd();

Но, как я сказал ранее, я думаю, что это связано с провайдером БД. Попробуйте добавить новую строку в свою БД и позже проверить, если было создано значение в столбце Id .


Популярные ответы

Прежде всего, вы не должны объединять Fluent Api с аннотацией данных, поэтому я предлагаю вам использовать один из следующих:

убедитесь, что у вас есть соответствующие настройки.

modelBuilder.Entity<Foo>()
            .HasKey(p => new { p.Name, p.Id });
modelBuilder.Entity<Foo>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

ИЛИ вы можете достичь этого, используя аннотацию данных

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key, Column(Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public string Name{ get; set; }
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow