【问题标题】:How to map enum as string in database如何将枚举映射为数据库中的字符串
【发布时间】:2011-01-09 00:29:00
【问题描述】:

我的桌子:

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

类和枚举:

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 : Input string was not in a correct format...

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

将枚举映射到它在数据库中的字符串表示形式的正确方法是什么?

编辑 - 我正在现有数据库上编写我的应用程序,我无法轻松修改它,因为它也被其他应用程序使用。所以数据库中的一些字段(我想在我的应用程序中表示为枚举)是 int 类型和一些 char(2) 类型。

【问题讨论】:

  • 还想知道,包括使用对不同枚举使用字符串和整数的数据库。 (只有与整数一起使用)

标签: string nhibernate fluent-nhibernate enums


【解决方案1】:

您需要创建一个自定义 IUserType 以将枚举转换为其字符串表示形式并返回。有一个 good example in C# here 和一个 example in VB.NET for working with enums here(向下滚动到实现 IUserType)。

【讨论】:

【解决方案2】:

据我所知,NHibernate 默认将枚举作为字符串存储在数据库中。我想我知道这里的问题是什么。您创建表的方式不正确。

如果您使用 Nhibernate,请使用它构建配置功能来创建表,而不是手动创建表,然后您将看到您的枚举存储为字符串。

我们在我们的应用程序中广泛使用枚举,我们将它作为字符串存储在数据库中是有意义的。原因很简单,如果我向枚举添加一个新值,那么如果没有设置默认值,那么我的代码和我的数据是紧密耦合的,这是我绝对不想要的。

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

您也可以使用 varchar 作为属性,而不是使用 char 作为字符串。

更新后: 你们不能在将其存储到数据库之前进行某种操作吗?因此,当您想要存储新的 char 枚举时,请编写一个为您生成 int 值的函数并将其存储在属性中并现在保存它,或者如果您想让它变得简单,该函数可以有一个 switch 案例。

所以你要做的是你没有从数据库中检索到的这个属性,而是在类 Status 中添加一个新属性,该属性基本上具有获取适当枚举的逻辑。

你认为这是个好主意吗?

希望这会有所帮助。

【讨论】:

  • 我更喜欢将枚举存储为 TINYINT,但我的问题是我有两个值存储为 VARCHAR。 NH 不会映射这些 :( 所以我不知道如何同时使用 String 和 Int 枚举。
  • 这里有同样的问题——一些“枚举”是整数,有些是字符。更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多