如何将枚举映射为数据库中的字符串

时间:2011-01-09 00:29:01

标签: string nhibernate fluent-nhibernate enums

我的表:

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)类型。

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中添加一个新属性,它基本上具有获取相应枚举的逻辑。

你认为这是个好主意吗?

希望这有帮助。