12

ich folgendes Modell erklärt haben, die EF-Core fließend API:Auto-Zuwachs auf Teilprimärschlüssel mit Entity Framework Core-

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

Beide Felder sind als Primärschlüssel markiert, wenn ich die Datenbank in PostgreSQL erstellen, aber Das Id-Feld ist nicht als automatisches Inkrement markiert. Ich habe auch versucht

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

auf das Id-Feld unter Foo hinzufügen, ohne es dabei einen Unterschied auf dem Migrationscode zu machen. Gibt es eine Möglichkeit, die ID-KI zu erstellen, obwohl es eine PPK ist?

+0

Welche Art ist Ihr 'Id' Eigentum? – octavioccl

+0

Id ist int, Name ist ein String – Martin

+1

Wenn 'Id' eine automatisch generierte Zahl ist, warum muss' Name' auch Teil des Primärschlüssels sein? –

Antwort

18

gut, diese Daten Anmerkungen sollte es tun, vielleicht ist so Beziehung mit dem PostgreSQL-Provider.

Von EF Core documentation:

auf dem Datenbankanbieter Je verwendet werden, können Werte Client-Seite von EF oder in der Datenbank generiert werden. Wenn der Wert von der -Datenbank generiert wird, kann EF einen temporären Wert zuweisen, wenn Sie dem Kontext die Entität hinzufügen. Dieser temporäre Wert wird dann während SaveChanges durch den von der Datenbank generierten Wert ersetzt.

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

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

Aber wie gesagt, ich denke, das etwas mit den DB-Provider verwendet ist. 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.

+0

Ich habe dies als eine Antwort markiert, obwohl ich meinen Code nicht funktioniert habe. Dies löst beim Start eine Ausnahme aus, die besagt: "Ich unterstütze das Erstellen von IsIdentity für int4 nicht", also denke ich, dass Sie Recht haben und dass dies vom DB-Provider abhängt und bisher scheint es noch nicht so, dass sie Unterstützung dafür implementiert haben. – Martin

+0

Nur ein Nachfolger, mit PostgreSQL können Sie ein bestehendes Feld nicht ändern, um AI zu werden. Dies führte zu der Ausnahme, die ich zuvor bekommen habe, also muss ich meine db wegwerfen, eine neue erstellen und alle Daten einspielen. – Martin

1

Zunächst einmal sollten Sie nicht die Fluent Api mit der Daten Anmerkung fusionieren und so würde ich Ihnen vorschlagen, eine der unten zu verwenden:

stellen Sie sicher, die Schlüssel gesetzt haben Correclty

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

OR Sie können es erreichen unter Verwendung von Daten Anmerkung als auch

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

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

Nicht, wenn er es in fließendem api definiert, ist die Reihenfolge die Reihenfolge der Eigenschaften im anonymen Objekt –

+0

@AlexanderDerck Ich habe meine Antwort bearbeitet. Danke –

+2

HasDatabaseGeneratedOption scheint nicht in der Version zu existieren, die ich verwende (7.0.0-rc1-final), oder fehlt mir eine Erweiterung oder etwas? – Martin

Verwandte Themen