Automatisches Inkrementieren eines partiellen Primärschlüssels mit Entity Framework Core

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

Frage

Ich habe das folgende Modell mit der EF Core fluent API deklariert:

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

Beide Felder werden beim Erstellen der Datenbank in PostgreSQL als Primärschlüssel markiert, das Feld ID ist jedoch nicht als automatisches Inkrement markiert. Ich habe auch versucht hinzuzufügen

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

zu dem Id-Feld unter Foo, ohne dass es irgendeinen Unterschied bezüglich des Migrationscodes geben würde. Gibt es eine Möglichkeit, die ID-KI zu erstellen, obwohl es eine PPK ist?

Akzeptierte Antwort

Nun, diese Daten-Annotationen sollten den Trick machen, vielleicht ist etwas mit dem PostgreSQL-Provider verbunden.

Aus der EF Core-Dokumentation :

Abhängig vom verwendeten Datenbankprovider können Werte clientseitig von EF oder in der Datenbank generiert werden. Wenn der Wert von der Datenbank generiert wird, kann EF beim Hinzufügen der Entität zum Kontext einen temporären Wert zuweisen. Dieser temporäre Wert wird dann während SaveChanges durch den von der Datenbank generierten Wert SaveChanges .

Sie könnten auch mit dieser Fluent Api Konfiguration versuchen:

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

Aber wie gesagt, ich denke, das ist etwas, das mit dem DB-Provider zusammenhängt. Versuchen Sie, Ihrer DB eine neue Zeile hinzuzufügen, und prüfen Sie später, ob ein Wert für die Spalte Id generiert wurde.


Beliebte Antwort

Zuerst sollten Sie den Fluent Api nicht mit der Datenannotation verbinden, daher würde ich Ihnen vorschlagen, einen der folgenden zu verwenden:

vergewissere dich, dass du die Schlüssel richtig gesetzt hast

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

ODER Sie können es auch mit Datenanmerkung erreichen

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

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow