Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将枚举映射为数据库中的字符串_String_Nhibernate_Fluent Nhibernate_Enums - Fatal编程技术网

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。更新了我的问题。有一个可以很好地实现这一点。有关如何使用它的示例,请参阅此。