2012-04-16 8 views
17

Wir verwenden EF CF seit einiger Zeit in unserer Lösung. Große Fans! Bis jetzt haben wir einen Hack verwendet, um Enums zu unterstützen (indem wir ein zusätzliches Feld im Modell erstellen, das Enum-Durring-Mapping ignorieren und das zusätzliche Feld der Spalte in der db zuordnen, die wir verwendet hätten). Traditionell haben wir unsere Enums als Strings (Varchars) in der DB gespeichert (macht es schön und lesbar). Jetzt mit Enum-Unterstützung in EF 5 (Beta 2) sieht es so aus, als ob es nur das Zuordnen von Enums zu int-Spalten in der DB unterstützt .... Können wir EF 5 dazu bringen, unsere Enums als String-Repräsentation zu speichern.Kann ich Enums als Zeichenfolgen in EF 5 speichern?

Wo "Typ" ist ein Enum vom Typ Document

public enum DocumentType 
    { 
     POInvoice, 
     NonPOInvoice, 
     Any 
    } 

Ich habe versucht, es zu kartieren mit:

public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow> 
    { 
     public WorkflowMap() 
     { 
      ToTable("Workflow", "Workflow"); 
      ... 
      Property(wf => wf.Type).HasColumnType("varchar"); 

     } 
    } 

Ich dachte, die magische Kugel sein würde, aber ..

Das wirft nur:

Sch ema angegeben ist nicht gültig. Fehler: (571,12): Fehler 2019: Member Die angegebene Zuordnung ist nicht gültig. Der Typ 'Dodson.Data.DataAccess.EFRepositories.DocumentType [Nullable = False, Default =]' des Mitglieds 'Typ' in Art 'Dodson.Data.DataAccess.EFRepositories.Workflow' ist nicht kompatibel mit ‚SqlServer .varchar [Nullable = Falsch, DefaultValue =, MaxLength = 8000, Unicode = False, FixedLength = False] ' des Mitglieds' Type 'im Typ' CodeFirstDatabaseSchema.Workflow '.

Ihre Gedanken?

Antwort

16

Dies ist derzeit nicht möglich. Enum in EF hat dieselben Einschränkungen wie Enums in CLR - sie werden nur als Satz von Integer-Werten bezeichnet. Überprüfen Sie this article für die Bestätigung:

Die EF-Enum-Typ-Definitionen leben in konzeptionellen Schicht. Ähnlich wie CLR enums die EF enums haben zugrunde liegenden Typ, der Edm.SByte ist, Edm.Byte, Edm.Int16, Edm.Int32 oder Edm.Int64 mit Edm.Int32 ist der Standard zugrunde liegenden Typ, wenn keiner angegeben wurde .

Ich postete article und related suggestion über dieses Problem. Wenn Sie diese Funktion in Zukunft sehen möchten, stimmen Sie bitte für den Vorschlag ab.

11

Ich traf dieses Problem vor ein paar Wochen. Das Beste, was ich mir vorstellen kann, ist ein bisschen hacky.

Ich habe eine Gender Enum auf der Klasse Person, und ich verwende Datenanmerkungen, um die Zeichenfolge der Datenbank zuzuordnen und die Enumeration zu ignorieren.

public class Person 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [Column("Gender")] 
    public string GenderString 
    { 
     get { return Gender.ToString(); } 
     private set { Gender = value.ParseEnum<Gender>(); } 
    } 

    [NotMapped] 
    public Gender Gender { get; set; } 
} 

Und die Erweiterungsmethode, um die richtige enum aus der Zeichenfolge zu erhalten.

public static class StringExtensions 
{ 
    public static T ParseEnum<T>(this string value) 
    { 
     return (T)Enum.Parse(typeof(T), value, true); 
    } 
} 

Beitrag für weitere Informationen einsehen - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/

+0

Diese in der Tat funktioniert, ist aber ein bisschen hacky. –

+0

Es ist. Vielleicht wird EF 7 etwas haben. – Bryan

+0

Schöne Lösung.Ein kleiner Kommentar, sobald Sie eine Erweiterungsmethode verwenden, könnten Sie einfach schreiben - value.ParseEnum (), anstelle von EnumExtensions.ParseEnum (Wert). – IFink

Verwandte Themen