2012-04-16 74 views
17

我們一直在我們的解決方案中使用EF CF。大粉絲!到目前爲止,我們一直在使用hack來支持枚舉(在模型上創建一個額外的字段;忽略枚舉映射;並將額外的字段映射到我們將使用的數據庫中的列)。傳統上,我們一直在數據庫中存儲我們的枚舉作爲字符串(varchars)(使它更好,更易讀)。現在在EF 5(Beta 2)中支持enum,它看起來像它只支持將枚舉映射到DB中的int列......我們可以讓EF 5將枚舉存儲爲它們的字符串表示形式。我可以將枚舉存儲爲EF 5中的字符串嗎?

其中 「類型」 是

public enum DocumentType 
    { 
     POInvoice, 
     NonPOInvoice, 
     Any 
    } 

我試圖使用地圖這類型DocumentType的枚舉:

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

     } 
    } 

我認爲是將成爲靈丹妙藥,但..

剛剛拋出:

Sch指定的ema無效。錯誤:(571,12):錯誤2019年:成員 指定的映射無效。類型 「Dodson.Data.DataAccess.EFRepositories.DocumentType [可空=假,默認值=」在 型構件「類型」的 「Dodson.Data.DataAccess.EFRepositories.Workflow」不是 與 「SqlServer的兼容'CodeFirstDatabaseSchema.Workflow'類型的成員'Type'的.varchar [Nullable = False,DefaultValue =,MaxLength = 8000,Unicode = False,FixedLength = False]' 。

您的想法?

回答

16

這是目前不可能的。 EF中的枚舉與CLR中的枚舉具有相同的限制 - 它們只是一組命名的整數值。檢查this article進行確認:

EF枚舉類型定義位於概念層。類似於 CLR枚舉EF枚舉具有基礎類型,它是Edm.SByte之一, Edm.Byte,Edm.Int16,Edm.Int32或Edm.Int64,Edm.Int32是 默認的基礎類型(如果沒有指定) 。

我發佈了articlerelated suggestion關於這個問題。如果您想在將來看到此功能,請對此建議進行投票。

11

幾周前我遇到了這個問題。我能想到的最好的是有點哈克。

我有Person類的性別枚舉,我使用數據註釋將字符串映射到數據庫並忽略枚舉。

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; } 
} 

而擴展方法從字符串中獲取正確的枚舉。

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

看到這個職位的全部細節 - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/

+0

這確實是工作,但有點哈克。 – 2015-08-05 09:44:38

+0

是的。也許EF 7會有一些東西。 – Bryan 2015-08-05 14:41:19

+0

很好的解決方案。一點點評論,一旦你使用擴展方法,你可以簡單的寫 - 值.ParseEnum (),而不是EnumExtensions.ParseEnum (值)。 – IFink 2016-03-21 10:40:29

相關問題