2011-01-09 11 views
6

Meine Tabelle:Wie Enum als String in der Datenbank abzubilden

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

Klasse und 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); 
} 

Wenn ich den folgenden Test ausführen, bekomme ich System.FormatException: Die Eingabezeichenfolge hatte kein richtiges Format ...

[Test] 
public void Blah() 
{ 
    MyTable myTable = Session.Get<MyTable>(1); 
    Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A)); 
} 

Was ist der richtige Weg, um eine Enumeration der String-Repräsentation in der Datenbank zuzuordnen?

Bearbeiten - Ich schreibe meine Anwendung auf einer vorhandenen Datenbank, die ich nicht leicht ändern kann, weil es auch von anderen Anwendungen verwendet wird. Also einige Felder in der Datenbank (die ich in meiner Anwendung als enums darstellen möchte) sind vom Typ int und einige vom Typ char (2).

+0

Möchten Sie auch wissen, einschließlich der Arbeit mit einer Datenbank, die Strings und Ints für verschiedene enums verwendet. (Ich habe es immer mit Ints funktioniert) – Phill

Antwort

5

Sie müssen einen benutzerdefinierten IUserType erstellen, um eine Enumeration in ihre Zeichenfolgendarstellung und zurück zu konvertieren. Es gibt eine good example in C# here und eine example in VB.NET for working with enums here (scrollen Sie nach unten, um IUserType zu implementieren).

+0

Es gibt [EnumStringType] (https : // GitHub.com/nhibernate/nhibernate-core/Blob/Master/src/NHibernate/Type/EnumStringType.cs), die dies actctly. Sehen Sie diese [Frage] (http://stackoverflow.com/questions/335533/normalizing-enumstringtype-in-nhibernate) für ein Beispiel, wie man das benutzt. – Darius

0

Nun, soweit ich weiß, speichert NHibernate Enums als String nur in der db standardmäßig. Ich denke, ich weiß, was das Problem hier ist. Die Art und Weise, wie Sie die Tabelle erstellen, ist falsch.

Wenn Sie Nhibernate verwenden, erstellen Sie die Konfigurationsfunktion, um die Tabellen zu erstellen, anstatt die Tabellen manuell zu erstellen. Dann sehen Sie, dass Ihre Enumeration als Zeichenfolge gespeichert wird.

Wir verwenden enums ausgiebig in unserer App und es ist sinnvoll für uns, es als Strings in der db zu speichern. Die Gründe sind einfach, wenn ich einem Enum-Tom einen neuen Wert hinzufüge, dann, wenn Standardwerte nicht gesetzt werden, dann sind mein Code und meine Daten fest verbunden, die ich definitiv nicht wollen würde.

Auch anstelle von char für Ihre Zeichenfolge können Sie Varchar für die Eigenschaft verwenden.

Nach dem Update: Kannst du irgendeine Art von Manipulation tun, bevor Sie es in der Datenbank speichern? Wenn Sie also die neuen Zeichenfolgen speichern möchten, schreiben Sie eine Funktion, die einen int-Wert für Sie generiert und in der Eigenschaft speichert, und speichern Sie sie jetzt. Wenn Sie es einfacher machen möchten, kann die Funktion einen switch case haben.

Also was Sie tun, ist, Sie haben keine get auf diese Eigenschaft, die von der db abgerufen wird, stattdessen fügen Sie eine neue Eigenschaft in der Klasse Status, die im Grunde die Logik der richtigen Enum hat.

Denken Sie, dass das eine gute Idee ist?

Hoffe, das hilft.

+0

Ich bevorzuge es, Enums als TINYINT zu speichern, aber mein Problem ist, dass ich zwei Werte habe, die als VARCHAR gespeichert sind. NH wont map this :(Also ich weiß nicht, wie man String und Int Enums zusammen verwendet. – Phill

+0

Das gleiche Problem hier - einige 'enums' sind int und einige sind Zeichen. Aktualisiert meine Frage. – sventevit