2015-10-07 14 views
17

Ich bin neu in EF und versuchen, meine ersten Schritte per Code ersten Ansatz in ETF6.0 und jetzt habe ich ein Problem.Wie String-Eigenschaft als Primärschlüssel in Entity Framework verwenden

Ich habe eine Eigenschaft

[Key] 
public string FooId { get; set; } 

die meine Primärschlüssel für das Modell ist.

Aber wenn ich laufe den

PM> Update-Database

Befehl in Paket-Manager-Konsole zu aktualisieren Migrationen in die Datenbank anhängige ich die folgende Fehlermeldung erhalten:

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

Wenn ich die PK in meinem Modell ändern

[Key] 
public int FooId { get; set; } 

alles funktioniert gut.

Aber ich würde die PK vom Typ String brauchen, weil es in meinem Fall absolut sens macht. Ich weiß, dass es Nachteile gibt, aber für mich ist es notwendig.

Ich sah einen älteren Beitrag hier How to make string as primary key in entity framework!.

Aber es scheint nicht mein Problem zu lösen, oder ich verstehe es einfach nicht.

Kann ich wirklich keine Zeichenfolge als PK in einer SQL-Datenbank verwenden?

Oder gibt es eine Möglichkeit, das zu tun?

+0

Der Schlüssel ist, um Identität Verzug geraten, so dass Sie es durch das Attribut deaktivieren müssen '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'Das bedeutet, dass Sie den Schlüssel beim Hinzufügen manuell angeben müssen (er wird nicht generiert). – Hopeless

Antwort

29

Dies ist der richtige Weg, um eine PK ohne Identität Autoincrement schaffen aktiviert:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public string FooId { get; set; } 
2

Wenn Sie möchten, dass Ihr Primärschlüssel eine Zeichenfolge ist, dann machen Sie sie nicht zu einer Identitätsspalte. Identitätsspalten generieren Primärschlüsselwerte für Sie, die Sie ausschalten sollten, wenn Sie beabsichtigen, die Werte selbst zu generieren.

1

Aus welchem ​​Grund haben Sie eine Zeichenfolge als Primärschlüssel?

Ich würde nur den Primärschlüssel zu einem Auto inkrementieren Integer-Feld setzen und einen Index auf das Feld string.

Auf diese Weise sollten Sie bei der Suche auf dem Tisch relativ schnell sein, und alle Joins und normalen Lookups werden von ihrer Geschwindigkeit nicht beeinflusst.

Sie können auch die Größe des String-Feldes steuern, das indiziert wird. Mit anderen Worten, Sie können sagen "indexieren Sie nur die ersten 5 Zeichen", wenn Sie denken, dass das ausreicht. Oder wenn Ihre Daten relativ ähnlich sein können, können Sie das gesamte Feld indizieren.

+0

Ich nehme an, dass seine Argumentation die gleiche war wie meine: Sie können .Find (fooId) od Kontextobjekt verwenden und Caching der ersten Ebene des Entity Framework anwenden Ich benutze es für den Benutzernamen –

Verwandte Themen