2013-02-23 52 views
5

我使用EF5和.NET 4.5。 我有一個特定的類在數據庫中被錯誤地生成。 雖然在我的網站上有點複雜,但我會簡化一下;ef 5數據庫中沒有生成codefirst枚舉集合

namespace Store.Enities 
{ 
    public enum Role 
    { Manager, Clerk } 

    public class User 
    { 
     public int Id {get; set;} 
     public ICollection<Role> Roles {get; set;} 
    } 

    public class StoreContext : DbContext 
    { 
     public DbSet<User> Users {get; set;} 

     public StoreContext() 
     { 
      Database.SetIntializer(new DropCreateDatabaseIfModelChanges<StoreContext>()); 
     } 
    } 
} 

正如您所看到的,用戶可以擁有多個角色。 出於某種原因,我無法將角色存儲在數據庫中。

回答

6

我仍然在運行Windows XP SP3,所以我無法安裝.NET Framework 4.5,但我無法運行測試以查看有什麼問題,但我可以猜到。在您的設計中,每個「用戶」可能具有零對多的「角色」,現在按慣例實體框架會在「角色」上生成一個引用「用戶」的外鍵,但由於「角色」是一個枚舉,它是一個複雜對象(Value Object)實體框架不支持這種情況,「實體框架不支持在實體類型上擁有複雜類型的集合」,您需要將角色作爲實體併爲其提供一個ID。只是爲了確定我是正確的嘗試使關係一對一(每個用戶只有一個角色),如果它的工作,那麼我是對的。

10

枚舉仍然是一個原始類型,特別是一個整數。正如User類不能具有映射到數據庫中某些內容的ICollection<int>一樣,它不能包含枚舉的集合。

您應該定義一個類Role可能看起來像這樣的:

public class Role 
{ 
    public int Id {get; set;} 
    public Roles Role {get; set;} 
} 

而改變枚舉的名字變成Roles(或什麼,但Role)。

0

基於答案由格特·阿諾德,你可以通過使用隱式操作創建一個漂亮的包裝類:

public class RoleWrapper 
{ 
    public int Id { get; set; } 

    // Role is any Enum 
    public Role Role { get; set; } 

    public static implicit operator Role(RoleWrapper val) 
    { 
     return val.Role; 
    } 
    public static implicit operator RoleWrapper(Role val) 
    { 
     return new RoleWrapper() { Role = val }; 
    } 
} 

這樣,您就可以使用帶有primitiv枚舉類型角色的集合:

myUser.Roles.Add(Role.WhateverRole); 
Role firstRole = myUser.Roles[0];