Incremento automático en clave primaria parcial con Entity Framework Core

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

Pregunta

He declarado el siguiente modelo utilizando la API fluida EF Core:

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

Ambos campos están marcados como la clave principal cuando creo la base de datos en PostgreSQL, pero el campo Id no está marcado como incremento automático. También he intentado añadir

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

al campo de ID debajo de Foo sin hacer ninguna diferencia en el código de migración. ¿Hay alguna manera de hacer la ID AI aunque sea un PPK?

Respuesta aceptada

Bueno, esas Anotaciones de datos deberían hacer el truco, tal vez sea algo relacionado con el proveedor de PostgreSQL.

De la documentación de EF Core :

Dependiendo del proveedor de la base de datos que se esté utilizando, los valores pueden ser generados por el cliente por EF o en la base de datos. Si el valor es generado por la base de datos, EF puede asignar un valor temporal cuando agregue la entidad al contexto. Este valor temporal será reemplazado por el valor generado por la base de datos durante SaveChanges .

También puedes probar con esta configuración de Fluent Api:

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

Pero como dije antes, creo que esto es algo relacionado con el proveedor de DB. Intente agregar una nueva fila a su base de datos y verifique más tarde si se generó un valor en la columna Id .


Respuesta popular

En primer lugar, no debe combinar el Api Fluido con la anotación de datos, así que le sugiero que utilice uno de los siguientes:

Asegúrate de que has establecido correctamente las claves

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

O puedes lograrlo usando la anotación de datos también

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

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow