Incremento automatico sulla chiave primaria parziale con Entity Framework Core

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

Domanda

Ho dichiarato il seguente modello utilizzando l'API fluente di EF Core:

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

Entrambi i campi sono contrassegnati come chiave primaria quando creo il database in PostgreSQL ma il campo Id non è contrassegnato come incremento automatico. Ho anche provato ad aggiungere

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

al campo Id in Foo senza che faccia alcuna differenza sul codice di migrazione. C'è un modo per rendere l'ID AI anche se è un PPK?

Risposta accettata

Bene, quelle annotazioni sui dati dovrebbero fare il trucco, forse è qualcosa che riguarda il provider PostgreSQL.

Dalla documentazione EF Core :

A seconda del provider di database utilizzato, i valori possono essere generati dal lato client tramite EF o nel database. Se il valore è generato dal database, EF può assegnare un valore temporaneo quando si aggiunge l'entità al contesto. Questo valore temporaneo verrà quindi sostituito dal valore generato dal database durante SaveChanges .

Puoi provare anche con questa configurazione di Fluent Api:

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

Ma come ho detto prima, penso che questo sia qualcosa che riguarda il provider di DB. Prova ad aggiungere una nuova riga al tuo DB e controlla in seguito se è stato generato un valore nella colonna Id .


Risposta popolare

Prima di tutto non dovresti unire il Fluent Api con l'annotazione dei dati, quindi ti suggerisco di usare uno dei seguenti:

assicurati di aver sistemato le chiavi

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

O puoi ottenerlo usando anche l'annotazione dei dati

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

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow