2013-02-23 11 views
5

Używam EF5 i .NET 4.5. Mam jedną konkretną klasę, która jest generowana niepoprawnie w bazie danych. Chociaż jest nieco bardziej skomplikowana na mojej stronie, uprnę;ef 5 kolekcja codefirst enum nie generowana w bazie danych

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

Jak widać użytkownik może mieć więcej niż jedną rolę. Z jakiegoś powodu nie mogę zarządzać przechowywaniem ról w bazie danych.

Odpowiedz

6

Wciąż pracuję pod Windows XP SP3, więc nie mogę zainstalować .NET Framework 4.5 i nie mogę uruchomić testu, aby zobaczyć, co jest nie tak, ale mogę zgadnąć. W twoim projekcie każdy "Użytkownik" może mieć zerową do wielu "Role", teraz zgodnie z konwencją Struktura Entity wygeneruje klucz obcy na "Role", aby odwołać się do "Użytkownicy", ale ponieważ "Rola" jest wyliczeniem, które jest Złożonym Obiektem (Obiekt Value Object) nie obsługuje tej sytuacji, "Entity Framework nie obsługuje gromadzenia typu złożonego w typie jednostki", należy ustawić Role jako encję i nadać jej identyfikator. Aby upewnić się, że jestem poprawny, spróbuj utworzyć relację jeden-do-jednego (każdy użytkownik ma tylko jedną rolę) i jeśli to zadziałało, mam rację.

10

Wyliczenie jest nadal typem pierwotnym, w szczególności liczbą całkowitą. Tak jak Twoja klasa User nie może mieć wartości ICollection<int> odwzorowanej na coś w bazie danych, nie może zawierać kolekcji wyliczenia.

Należy zdefiniować klasę Role który mógłby wyglądać następująco:

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

i zmienić nazwę enum do Roles (lub czegokolwiek, ale Role).

0

Na podstawie odpowiedzi Gert Amold można stworzyć piękny klasy otoki za pomocą niejawnego operatora:

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

W ten sposób można korzystać z kolekcji z primitiv typu Enum Rola:

myUser.Roles.Add(Role.WhateverRole); 
Role firstRole = myUser.Roles[0]; 
Powiązane problemy