C# fluent nhibernate字符串到枚举选择查询示例

C# fluent nhibernate字符串到枚举选择查询示例,c#,nhibernate,enums,fluent-nhibernate,queryover,C#,Nhibernate,Enums,Fluent Nhibernate,Queryover,我正在使用流利的nhibernate。我有一个数据库列存储字符串VALUE1,VALUE2。在获取时,需要将它们转换为枚举值。 基本上,我不知道:- 1) 需要对此枚举执行哪些操作,以便nhibernate理解并能够将字符串行转换为各自的枚举值。 (如果是enumString?那么如何使用?/其他建议) 2) 查询EnumField=value1的实体 下面是为问题创建上下文的代码 public enum SomeEnum { Value1, Value2 } class En

我正在使用流利的nhibernate。我有一个数据库列存储字符串
VALUE1
VALUE2
。在获取时,需要将它们转换为枚举值。 基本上,我不知道:-

1) 需要对此枚举执行哪些操作,以便nhibernate理解并能够将字符串行转换为各自的枚举值。
(如果是enumString?那么如何使用?/其他建议)

2)
查询EnumField=value1的实体

下面是为问题创建上下文的代码

public enum SomeEnum
{
    Value1,
    Value2
}

class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Id(x => x.id);
        Map(x => x.EnumField);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var factory = Fluently.Configure().Mappings(x => x.FluentMappings.AddFromAssemblyOf<Entity>())
                                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
                                .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Data Source=.;Initial Catalog=nhtest;Integrated Security=True"))
                                .BuildSessionFactory();
        using (var session = factory.OpenSession())
        {
             **need a way to query for all `Value1`** 
        }

    }
}
public enum SomeEnum
{
价值1,
价值2
}
类EntityMap:ClassMap
{
公共实体映射()
{
Id(x=>x.Id);
映射(x=>x.EnumField);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var factory=fluent.Configure().Mappings(x=>x.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(config=>newschemaexport(config).Create(false,true))
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(“数据源=;初始目录=nhtest;集成安全性=True”))
.BuildSessionFactory();
使用(var session=factory.OpenSession())
{
**需要一种查询所有“Value1”的方法***
}
}
}

到目前为止,我看到的东西只涉及一个通用的save命令,我还没有找到任何查询示例

,因为您使用的是Fluent NHibernate,这项工作已经为您完成了。将枚举持久化为字符串是Fluent NHibernate的默认行为

NHibernate(不带Fluent NH)默认情况下将枚举持久化为intFluent NH通过将
genericenumapper
类型应用于属性映射来更改此行为(请参见)

由于Fluent NH已经处理了指定映射的问题,因此代码的其余部分可以安全地忽略它作为字符串存储在数据库中的事实。例如:

var result = session.Query<Entity>()
    .Where(x => x.EnumField == SomeEnum.Value1)
    .ToList();
var result=session.Query()
.Where(x=>x.EnumField==SomeEnum.Value1)
.ToList();

Ok它似乎与手动映射一起工作,但仅在精确匹配的情况下(数据库中的
Value1
myValue1
不会映射到
Value1
myValue1
)。对于自动映射的实体,它似乎根本不起作用。您使用的是什么数据库引擎?SQL Server、Oracle等。?默认情况下,它是否将字符串视为区分大小写的?或者是否对列应用了区分大小写的排序规则?SQL server 2008,这些字符串都是我必须处理的现有数据。此表中没有任何内容会自动修改它们(没有架构/触发器…),但如果NHibernate似乎在以区分大小写的方式过滤枚举,则这是SQL Server问题,而不是NHibernate问题。在SQL Management Studio中直接执行EnumField='Value1'的实体中的
SELECT*可能会得到相同的结果。SQL Server的默认排序规则是SQL拉丁1\u通用CP1\u CI\u AS。结尾附近的“CI”表示“不区分大小写”,这正是您想要的。排序规则可以应用于整个数据库,也可以应用于单个列。像SQL\u Latin1\u General\u CP1\u CS\u AS这样的排序规则可以解释您看到的行为。似乎有效。从EnumField='Value1'所在的实体中选择
SELECT*
也可以调出
Value1