2011-01-09 18 views
6

Il mio tavolo:Come map enum come stringa nel database

create table MyTable (
    Id int identity(1,1) not null, 
    MyStatus char(2) not null 
) 
insert into MyTable(MyStatus) select 'A' 

Classe ed enum:

public class MyTable 
{ 
    public virtual int Id { get; set; } 
    public virtual MyTableStatus MyStatus { get; set; } 
} 

public enum MyTableStatus 
{ 
    A, 
    B 
} 

Mapping:

public MyTableMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.MyStatus); 
} 

Quando eseguo il seguente test, ottengo System.FormatException: la stringa di input non era in un formato corretto ...

Qual è il modo corretto per mappare un enum alla sua rappresentazione di stringa nel database?

Modifica - Sto scrivendo la mia applicazione su un database esistente, che non posso modificare facilmente perché viene utilizzata anche da altre applicazioni. Quindi alcuni campi nel database (che vorrei rappresentare come enumerazione nella mia applicazione) sono di tipo int e alcuni di tipo char (2).

+0

Vorrei anche sapere, tra cui lavorare con un database che utilizza stringhe e int per enumerazioni diverse. (Ho sempre funzionato con gli interi) – Phill

risposta

5

È necessario creare un IUserType personalizzato per convertire un enum nella sua rappresentazione di stringa e viceversa. C'è uno good example in C# here e uno example in VB.NET for working with enums here (scorrere verso il basso per implementare IUserType).

+0

C'è [EnumStringType] (https : // GitHub.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Type/EnumStringType.cs) che fa proprio questo. Vedere questa [domanda] (http://stackoverflow.com/questions/335533/normalizing-enumstringtype-in-nhibhibate) per un esempio su come utilizzare questo. – Darius

0

Per quanto ne so, NHibernate memorizza le enumerazioni come stringa solo nel db per impostazione predefinita. Penso di sapere qual è il problema qui. Il modo in cui stai creando la tabella non è corretto.

se si utilizza Nhibernate, utilizzare la funzione di configurazione build per creare le tabelle invece di creare manualmente le tabelle e quindi si vedrà che l'enumerazione è memorizzata come stringa.

Usiamo ampiamente enum nella nostra app e ha senso per noi memorizzarlo come stringhe nel db. Le ragioni sono semplici se aggiungo un nuovo valore a un enum tom, quindi se i valori predefiniti non sono impostati, il mio codice e i miei dati sono strettamente accoppiati che non vorrei assolutamente.

SimpleConfig.ExposeConfiguration(c => new SchemaExport(c).Create(false, true)).BuildConfiguration(); 

Inoltre, invece di utilizzare char per la stringa è possibile utilizzare varchar per la proprietà.

Dopo l'aggiornamento: Non riesci a fare qualche tipo di manipolazione prima di memorizzarla nel database? Quindi, quando vuoi memorizzare i nuovi enumerati di carattere, scrivi una funzione che genera un valore int per te e memorizzalo nella proprietà e ora salvalo o se vuoi renderlo semplice la funzione può avere un caso di scambio.

Quindi quello che fai è non avere un get su questa proprietà che viene recuperata dal db invece si aggiunge una nuova proprietà nella classe Status che ha fondamentalmente la logica di ottenere l'enum appropriato.

Pensi che sia una buona idea?

Spero che questo aiuti.

+0

Preferisco memorizzare Enums come TINYINT, ma il mio problema è che ho due valori che sono memorizzati come VARCHAR. NH non li mapperà :(Quindi non so come usare insieme sia String che Int Enum. – Phill

+0

Lo stesso problema qui - alcuni 'enum' sono int e alcuni sono caratteri .. Aggiornato la mia domanda – sventevit

Problemi correlati