2013-02-23 23 views
5

Sto usando EF5 e .NET 4.5. Ho una classe particolare che viene generata in modo errato nel database. Anche se è un po 'più complicato nel mio sito web, semplificherò;ef 5 codefirst enum collezione non generata nella banca dati

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

Come si può vedere un utente può avere più di un ruolo. Per qualche motivo non riesco a memorizzare i ruoli nel database.

risposta

6

Sono ancora in esecuzione Windows XP SP3, quindi non riesco a installare .NET Framework 4.5 e non riesco a eseguire un test per vedere cosa c'è che non va, ma posso indovinare. Nel tuo progetto ogni "Utente" può avere "Ruoli" zero-a-molti, ora per convenzione Entity Framework genererebbe una chiave esterna su "Ruoli" per fare riferimento a "Utenti" ma poiché "Ruolo" è un'enumerazione che è un Oggetto Complesso Il framework di entità (Oggetto valore) non supporta questa situazione, "Entity Framework non supporta la raccolta di un tipo complesso su un tipo di entità", è necessario creare un ruolo in Entity e assegnargli un ID. Per essere sicuro di avere ragione, prova a creare una relazione uno a uno (ogni utente ha un solo ruolo) e se ha funzionato, allora ho ragione.

10

Un enum è ancora un tipo primitivo, in particolare un numero intero. Proprio come la tua classe User non può avere un ICollection<int> che esegue il mapping su qualcosa nel database, non può avere una raccolta dell'enumerazione.

Si dovrebbe definire una classe Role che potrebbe assomigliare a questo:

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

e cambiare il nome della enum in Roles (o qualcosa, ma Role).

0

Sulla base della risposta da Gert Amold si potrebbe creare una bella classe wrapper utilizzando l'operatore implicita:

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

In questo modo è possibile utilizzare la collezione con il primitiv tipo Enum Ruolo:

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