2013-10-01 12 views
26

Sto utilizzando Entity Framework 5, DB prima. So come definire un enum sul mio modello e impostare il tipo di campo su quell'enumerazione.Come utilizzare un enum esistente con DB Entity Framework First

Ora, ho il requisito di mappare un campo MyField a un enum definito esternamente, vale a dire non nel modello EF (OtherNamespace.MyEnum). Il progettista non mi consente di impostare il tipo su qualsiasi cosa al di fuori del modello. Ho provato a modificare il file edmx manualmente, ma che causa un errore:

Error 10016: Error resolving item 'MyField'. The exception message is: 'Unresolved reference 'OtherNamespace.MyEnum'.'.

OtherNamespace.MyEnum viene riferito da mio progetto.

Come si fa?

+0

La vostra intenzione di avere a che fare un po 'di logica in più per ottenere che, si potrebbe mettere che nel setter. – Botonomous

+0

@Dunbar cosa intendi? Può essere più preciso? –

+0

Come nel setter della proprietà, impostate un'istanza non mappata dell'oggetto che volete veramente impostare. – Botonomous

risposta

52

Questo può essere fatto, ma richiede un piccolo sacrificio sul lato del database. Entity Framework (5 in poi) supporta la mappatura di un campo per un'enumerazione, ma solo per byte, sbyte, short, ushort, int, uint, long o ulong tipi.

Supponiamo di avere la seguente tabella di esempio:

CREATE TABLE [People](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [Name] [varchar](50) NOT NULL, 
    [Title] [int] NOT NULL 
) 

Title è stato dichiarato come un intero. In un database reale, questa potrebbe essere una chiave esterna su una tabella TitleTypes.

Inoltre, supponiamo che l'enumerazione esterno che stiamo per essere legando in è definito come:

namespace Enumerations 
{ 
    public enum TitleEnum 
    { 
     Mr, 
     Mrs, 
     Dr, 
     None 
    } 
} 

Se importiamo la tabella People in un EDMX possiamo fare clic destro sulla colonna Title e conversione in eNUM

Convert To Enum

si aprirà una finestra di dialogo che ci permette di specificare un nome per il censimento nel t he EDMX ModelStore, definire eventuali valori per il conteggio O collegamento a un elenco esterno tramite Tipo di riferimento esterno.

Assegnare un tipo Nome TitleEnum, verificare Tipo di riferimento esterno e digitare Enumerations.TitleEnum nel campo fornito. Fare clic su OK e associerà la colonna all'enumerazione esterna.

Nota:

  • Mentre entrambi sono chiamati TitleEnum, che agisca come un passthrough alla enumerazione esterna
  • il tipo di colonna e l'enumerazione esterno deve corrispondere

Linking the Enumeration

Ora, quando creiamo una nuova persona, possiamo utilizzare l'enumerazione e sarà tradotta nella sua rappresentazione Int.

Data.ScratchEntities context = new Data.ScratchEntities(); 
Data.Person person = new Data.Person(); 
person.Name = "Jane Smith"; 
//Note the use of the external enumeration here 
person.Title = Enumerations.TitleEnum.Mrs; 
context.People.Add(person); 
context.SaveChanges(); 

Intellisense

+1

Grazie per una risposta ben documentata. Ma non sta funzionando per me. Tutto è a posto fino all'ultimo passaggio, ma sto ricevendo un errore del compilatore: impossibile convertire il tipo di fonte "Enumerations.TitleEnum" nel tipo di destinazione "MyNamespace.TitleEnum". Che cosa sto facendo di sbagliato? Potrebbe essere perché il mio tipo di base è 'byte' piuttosto che' int'? –

+1

Sì. Il tipo di colonna e il tipo di base per l'enumerazione dovranno corrispondere in modo che possa eseguire una conversione implicita da uno all'altro. – cbeckner

+1

La colonna nel db è un minuscolo, che mappa in byte ...? E se fosse così, un cast esplicito dovrebbe funzionare - ma non è così. –