String 如何将枚举映射为数据库中的字符串
我的桌子:String 如何将枚举映射为数据库中的字符串,string,nhibernate,fluent-nhibernate,enums,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' 类和枚举: public class MyTable { public virtual int Id { get; set; } public virtual MyTableStatus MyStatus {
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:输入字符串的格式不正确
[Test]
public void Blah()
{
MyTable myTable = Session.Get<MyTable>(1);
Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A));
}
[测试]
公开无效的废话
{
MyTable MyTable=Session.Get(1);
Assert.That(myTable.MyStatus,Is.EqualTo(MyTableStatus.A));
}
将枚举映射到数据库中的字符串表示形式的正确方法是什么
编辑-我在现有数据库上编写应用程序,无法轻松修改,因为其他应用程序也在使用该数据库。因此,数据库中的一些字段(我想在我的应用程序中将其表示为enum)是int类型,一些是char(2)类型。据我所知,NHibernate默认情况下仅将enum作为字符串存储在数据库中。我想我知道这里的问题是什么。创建表的方式不正确 如果您正在使用Nhibernate,请使用它的build configuration函数来创建表,而不是手动创建表,然后您将看到您的枚举存储为字符串 我们在应用程序中广泛使用枚举,将其作为字符串存储在数据库中是有意义的。原因很简单,如果我向枚举tom添加一个新值,那么如果没有设置默认值,那么我的代码和数据就会紧密耦合,这是我绝对不想要的
SimpleConfig.ExposeConfiguration(c => new SchemaExport(c).Create(false, true)).BuildConfiguration();
您还可以使用varchar作为属性,而不是使用char作为字符串
更新后:
你们不能在将数据存储到数据库之前进行一些操作吗?因此,当您想要存储新的字符枚举时,请编写一个函数,为您生成一个int值,并将其存储在property中,然后立即保存它,或者如果您想要使其简单化,则该函数可以具有一个开关大小写
因此,您要做的是,您没有一个从db检索的这个属性的get,而是在类状态中添加一个新属性,该属性基本上具有获取适当枚举的逻辑
你认为这是个好主意吗
希望这能有所帮助。您需要创建一个自定义IUserType来将枚举转换为其字符串表示形式并返回。有一个和一个(向下滚动以实现IUserType)。还想知道,包括使用一个数据库,该数据库使用字符串和整数来实现不同的枚举。(只在使用int时使用过)我更喜欢将枚举存储为TINYINT,但我的问题是有两个值存储为VARCHAR。NH不会映射这些:(所以我不知道如何同时使用字符串和Int枚举。这里有相同的问题-一些“枚举”是Int,一些是char。更新了我的问题。有一个可以很好地实现这一点。有关如何使用它的示例,请参阅此。