2014-02-25 14 views
5

Mit EntityFramework-Code zuerst, habe ich eine einfache Foo Tabelle erstellt. Hier ist meine Einheit:DatabaseGeneratedOption.Identity generiert keine ID

public class Foo 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual string Id { get; set; } 

    public virtual string Name { get; set; } 
} 

Allerdings, wenn ich versuche, eine neue Zeile einzufügen, erhalte ich eine Cannot insert the value NULL into column 'Id'. Warum passiert das, wenn ich ein Attribut DatabaseGenerated hinzugefügt habe? Löschen und neu erstellen meiner Tabelle macht keinen Unterschied.

+0

Zeigt die erstellte Tabelle an, dass die ID-Spalte als IDENTITY markiert ist? Was ist die zugrunde liegende Datenbank? MS SQL? Orakel? –

+0

@DStanley Die Spalte 'Id' ist nicht als Identität gekennzeichnet. Die zugrunde liegende Datenbank ist MS SQL. – Jonathan

+0

Welche Version von EF verwenden Sie? –

Antwort

7

Identitäten für string Spaltentypen sind nicht mit SQL Server unterstützt. (Wie soll eine solche Zeichenfolge aussehen?) Um dies zu erreichen, könnten Sie beispielsweise eine berechnete Spalte/benutzerdefinierte Funktion in SQL Server hinzufügen, die eine Zeichenfolge aus einer normalen Identitätsspalte formatiert - wie in der Abbildung here gezeigt.

+0

Ich folgte der Leitung von asp.net [IdentityUser] (http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.entityframework.identityuser.id (v = vs.111) .aspx), die eine Zeichenfolge für die ID verwendet. Säule. Irgendeine Idee, wie der Wert in diesem Fall erzeugt wird? – Jonathan

+0

@ Jonathan: Ich weiß nicht, aber ich könnte mir vorstellen, es ist einfach nicht Datenbank generiert, sondern eine Zeichenfolge, die Sie manuell als eindeutigen Wert (wie ein Benutzername oder eine Guid in eine Zeichenfolge konvertiert). – Slauma

5
  1. Sie vergessen, das Key Attribut. und es besteht keine Notwendigkeit, virtual für Primärschlüssel zu verwenden.
  2. Wie von Slauma erwähnt, können Sie nicht Identity für String-Datentyp verwenden.

Versuchen Sie diesen Code:

public class Foo 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual string Name { get; set; } 
} 
+0

Leider macht das keinen Unterschied. – Jonathan

+1

ops! Auch die Zeichenfolge kann nicht als Identität verwendet werden. –

+0

Ich hatte ein Problem damit und glaube es oder nicht. Ich habe es funktioniert, indem ich den Eigenschaftsnamen meiner Id von ID zu {className} Id änderte. Ich benutzte jedoch einen Guid-Typ. –

Verwandte Themen