2013-02-23 19 views
5

Tôi đang sử dụng EF5 và .NET 4.5. Tôi có một lớp cụ thể đang được tạo không chính xác trong cơ sở dữ liệu. Mặc dù nó hơi phức tạp hơn trong trang web của tôi, tôi sẽ đơn giản hóa;ef 5 codefirst enum collection không được tạo trong cơ sở dữ liệu

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

Như bạn có thể thấy người dùng có thể có nhiều vai trò. Vì một số lý do tôi không thể quản lý để lưu trữ các vai trò trong cơ sở dữ liệu.

Trả lời

6

Tôi vẫn đang chạy Windows XP SP3 vì vậy tôi không thể cài đặt .NET Framework 4.5 và tôi không thể chạy thử nghiệm để xem có gì sai nhưng tôi có thể đoán. Trong thiết kế của bạn, mỗi "Người dùng" có thể có các vai trò "không" với nhiều "Vai trò", bây giờ theo quy tắc Khung thực thể sẽ tạo khóa ngoại trên "Vai trò" để tham chiếu "Người dùng" nhưng vì "Vai trò" là một kiểu liệt kê là một đối tượng phức tạp. Khung thực thể (Object Object) không hỗ trợ tình huống này, "Entity Framework không hỗ trợ việc có một tập hợp kiểu phức trên kiểu thực thể", bạn cần đặt Role thành một thực thể và cung cấp cho nó một ID. Chỉ cần chắc chắn tôi đang thử chính xác làm cho mối quan hệ một-một (mỗi người dùng chỉ có một vai trò) và nếu nó làm việc thì tôi đúng.

10

Một enum vẫn là kiểu nguyên thủy, cụ thể là một số nguyên. Cũng giống như lớp User của bạn không thể có ICollection<int> ánh xạ tới thứ gì đó trong cơ sở dữ liệu, nó không thể có bộ sưu tập enum.

Bạn nên xác định một lớp Role có thể trông như thế này:

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

Và thay đổi tên của enum vào Roles (hoặc bất cứ điều gì nhưng Role).

0

Dựa trên câu trả lời của Gert Amold bạn có thể tạo ra một lớp wrapper đẹp bằng cách sử dụng các nhà điều hành ngầm:

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

Bằng cách này bạn có thể sử dụng bộ sưu tập với primitiv Enum loại Vai trò:

myUser.Roles.Add(Role.WhateverRole); 
Role firstRole = myUser.Roles[0]; 
Các vấn đề liên quan