我的表:
create table MyTable (
Id int identity(1,1) not null,
MyStatus char(2) not null
)
insert into MyTable(MyStatus) select 'A'
Class and enum:
public class MyTable
{
public virtual int Id { get; set; }
public virtual MyTableStatus MyStatus { get; set; }
}
public enum MyTableStatus
{
A,
B
}
映射:
public MyTableMap()
{
Id(x => x.Id);
Map(x => x.MyStatus);
}
当我执行以下测试时,我得到System.FormatException:输入字符串的格式不正确...
[Test]
public void Blah()
{
MyTable myTable = Session.Get<MyTable>(1);
Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A));
}
将枚举映射到数据库中的字符串表示形式的正确方法是什么?
编辑 - 我在现有数据库上编写应用程序,我无法轻易修改,因为它也被其他应用程序使用。所以数据库中的一些字段(我想在我的应用程序中表示为枚举)是int类型和一些char(2)类型。
答案 0 :(得分:5)
您需要创建自定义IUserType以将枚举转换为其字符串表示形式并返回。有一个good example in C# here和一个example in VB.NET for working with enums here(向下滚动到实现IUserType)。
答案 1 :(得分:0)
据我所知,NHibernate默认情况下只将枚举存储为数据库中的字符串。我想我知道这里的问题是什么。您创建表的方式不正确。
如果您正在使用Nhibernate,请使用它来构建配置函数来创建表而不是手动创建表,然后您将看到您的枚举存储为字符串。
我们在应用程序中广泛使用枚举,我们将它作为字符串存储在数据库中是有意义的。原因很简单,如果我向枚举tom添加一个新值,那么如果没有设置默认值,那么我的代码和我的数据紧密耦合,我绝对不会想要。
SimpleConfig.ExposeConfiguration(c => new SchemaExport(c).Create(false, true)).BuildConfiguration();
也可以使用varchar作为属性,而不是使用char作为字符串。
更新后: 你不能在将它存储到数据库之前进行某种操作吗?因此,当您想要存储新的char枚举时,编写一个为您生成int值并将其存储在属性中的函数,现在将其保存,或者如果您想使其简单,则该函数可以具有切换案例。
所以你要做的就是你没有从db中检索到的这个属性,而是在类Status中添加一个新属性,它基本上具有获取相应枚举的逻辑。
你认为这是个好主意吗?
希望这有帮助。