首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将enum作为字符串映射为流利的nhibernate?

要将enum作为字符串映射为流利的NHibernate,您需要遵循以下步骤:

  1. 首先,在您的应用程序中定义一个枚举类型。例如,假设您要定义一个表示颜色的枚举类型:
代码语言:csharp
复制
public enum Color
{
    Red,
    Green,
    Blue
}
  1. 接下来,在您的NHibernate映射类中,使用IUserType接口来自定义枚举类型的映射。例如,您可以创建一个名为ColorUserType的类来实现IUserType接口:
代码语言:csharp
复制
public class ColorUserType : IUserType
{
    public new bool Equals(object x, object y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (x == null || y == null) return false;
        return x.Equals(y);
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var value = NHibernateUtil.String.NullSafeGet(rs, names[0]);
        if (value == null) return null;
        return Enum.Parse(typeof(Color), value.ToString());
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        if (value == null)
        {
            NHibernateUtil.String.NullSafeSet(cmd, null, index);
        }
        else
        {
            NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index);
        }
    }

    public object DeepCopy(object value)
    {
        return value;
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return cached;
    }

    public object Disassemble(object value)
    {
        return value;
    }

    public SqlType[] SqlTypes { get; } = { NHibernateUtil.String.SqlType };
    public Type ReturnedType { get; } = typeof(Color);
    public bool IsMutable { get; } = false;
}
  1. 最后,在您的NHibernate映射类中,使用ColorUserType来映射您的枚举属性。例如,假设您有一个名为Product的类,其中包含一个Color属性,您可以这样映射它:
代码语言:csharp
复制
public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Color, cm =>
        {
            cm.Column("color");
            cm.CustomType<ColorUserType>();
            cm.Not.Nullable();
        });
    }
}

现在,当您使用NHibernate查询和保存Product对象时,它将自动将Color属性映射为字符串,并在数据库中存储枚举值的名称。这样,您就可以在NHibernate中流利地使用枚举类型了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NHibernate总结

NHibernate不仅仅管理.NET 类到数据库表映射(包括.NET 数据类型到SQL 数据类型映射),还提供数据查询和获取数据方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据时间...NHibernate目标是对于开发者通常数据持久化相关编程任务,解放其中95%。并请记住NHibernate作为数据库访问层,是与你程序紧密集成。...封装Nhibernate底层操作,People.cs实体类,People.hbm.xml映射文件(把数据库表People映射到实体类People)。...virtual,要不然会报错 (4)     下面我们开始People实体类进行数据库表映射配置People.hbm.xml NHibernate要知道怎样去加载和存储持久化类对象。...这正是NHibernate映射文件发挥作用地方。映射文件包含了对象/关系映射所需元数据。元数据包含持久化类声明和属性到数据库映射

90540

Fluent NHibernate之旅二--Entity Mapping

本节内容: 简单实体映射 使用自定义类型映射实体属性 NHibernate实体映射(Entity Mapping)做非常好,虽然不是完美,但一些我们经常使用,基本上已经都支持了,而且配置也相对比较简单...hbm.xml文件,自己再看一篇,看看NHibernate映射方式,所以是非常好一个方法,我有时候做映射时候,遇到问题都会生成出来,随时查看问题所在,所以说是非常有用一个方法,而且你可以把你映射文件直接用到...二、使用自定义类型映射实体属性 NHibernate支持我们用自定义类型来映射属性,但因为我是初学,我真的不会,当然我在网上找到了相关资料,在此也不多说,就说说Fluent方式吧,在我映射自定义属性时候...,而传统方式作为学习之用。...在Order实体中,我们看到了订单状态我用了OrderState枚举类型,数据库存储类型tinyint,对于它映射,我们只需要: public class OrderMap : ClassMap<Order

99990

Nhibernate入门与demo

先看一张经典图:      ORM:对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示对象映射到基于SQL 关系模型数据结构中去...通俗讲,就是我们操作实体类,然后让ORM框架自动映射到数据库中。      而Nhibernate就是:.Net环境下实现ORM技术一个框架!     ...先看项目整体图,作为初学demo 没有层次,没有优化,只是作为入门一个简单介绍!      第一步:设计数据库中表。建立一个User表。...然后对应数据库表名。设置延迟加载false。具体可以参考Nhibernate官方文档。 3、一定要将这个文件属性:生成操作设置嵌入资源!     ...;uid=sa;pwd=123;database=HkTemp;是配置数据库连接字符串

33130

C#——Nhibernate探索

调查结果: 对象与数据库映射是保存在XML文件中,于是我配置XML映射文件如下。 该XML文件属性,要求设置其生成操作为【嵌入资源】。 但我怕它丢失,还给他设置了始终复制属性。...,所以,如果程序可以运行,那么这个类,一定会读配置文件中SQL字符串连接。...我推断,这里就是数据库连接字符串模板。 由于我使用数据库是sqlserver,所以,我复制了mssql.cfg.xml。...这句话意思是,映射我创建那个类库。 我推断,Nherbinate是读这个配置文件,然后到这个程序集里,反射查询那些poco对象。...---------------------------------------------------------------------------------------------- 注:此文章原创

48130

Fluent NHibernate之旅(三)-- 继承

经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定了解了,FluentNHibernate实际就是对 NHibernate 映射一定扩展,我们能完全利用强类型...、泛型、Lambde表达式等等Vs、Framework等特性简单完成映射工作,同时也能让我们学习NHibernate映射方式,一举夺得,这么好玩东东,有理由不继续完成这个系列吗?...从这一篇开始,我们将使用Fluent NHibernate RC 1.0 版来进行演示,先前代码,我会另外进行说明 继承 在OOP中,继承作为OO中重要特性,如果NHibernate没有对它支持,...在说一下DiscriminateSubClassesOnColumn,这就是标识符一个映射方式,因为在RC版之前,我们可以使用SetAttribate方法,设定我们父类"not-null" 但是在...,而且现在更新也非常快,后面几张可能说下几种不常见映射和会遇到些麻烦,不过感觉园子里使用NHibernate的人不太多,关注度不多,不过不影响我继续写下去决心,这次也很偶然接触了FNT,确实有好多好地方可以借鉴一下

66480

C# 数据操作系列 - 11 NHibernate 配置和结构介绍

ISessionFactory - NHibernate.ISessionFactory: 一个基于单数据库已编译映射缓存,它是持久不变且线程安全(额,这句话是从它文档翻译过来)。...dialect 数据库方言,表示NHibernate连接数据库是什么,该用哪种格式解析关系映射到数据库SQL语句 default_schema 默认schema,用来设置连接字符串连接数据库默认...数据库连接字符串名称,指的是配置在程序配置文件中 connectionStrings节点数据连接字符串。...show_sql 是否在控制台中打印转换SQL语句,一般在调试过程中会设置true,用来确认生成SQL是否正确等。...总结 这是一篇枯燥乏味说明文,主要介绍了Nhibernate基本内容。下一章我们来试试,如何创建Nhibernate映射配置。

1.2K20

NHibernate教程

NHibernate是一个面向.Net环境对象/关系数据库映射工具。...NHibernate除了能将一张表映射一个对象,还可以将表间关系变为对象属性。例如学生和课程间多对多关系就可以转化为学生类中一个课程集合属性。...二、NHibernate使用步骤 1.系统引入NHibernate库,并且配置NHibernate; 2.新建一个将要持久化.Net对象表; 3.构建一个需要被持久化.Net类; 4.构建一个可以让...NHibernate知道如何完成ORM映射XML文件; 5.使用NHibernateAPI来编程 三、NHibernate使用 1....配置NHibernate (1)NHibernate配置文件有两种:在桌面应用程序(WinForm)中App.config,在网页应用程序(WebForm)中web.config。

34310

Nhibernate_nhibernate与ef区别

大家好,我是架构君,一个会写代码吟诗架构师。今天说一说Nhibernate_nhibernate与ef区别,希望能够帮助大家进步!!! 什么是NHibernate?...步骤3:编写映射文件(Mapping File) 现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好)方法就是每一个类编写一个映射文件...让我们返回到"id" tag,你可能会猜想这个tag和映射到表Primary Key有关.正确.ID tag格式和Property tag相似.我们从Property(name)映射到目标数据库字段...Tip:如果你使用vs.net编译,设置Build Action,把User.hbm.xml文件作为资源绑定到Asssembly,这样映射文件就成了Asssembly一部分了.后面我们会明白这个步骤重要性...Configuration对象知道所有在.Net类和后端数据库之间映射关系, Configuration cfg = new Configuration(); cfg.AddAssembly("NHibernate.Demo.QuickStart

56730

NHibernate详解

NHibernate 你处理这些,远胜于你不得不写SQL去从数据库存取对象。你代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确表和字段中去。...第三步:写映射文件 现在我们有数据表和需要去映射.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。...最易于管理办法是每一个类写一个映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和类同一个目录里,NHiberante将会使得事情简单起来。...内嵌generator 标签告诉NHibernate 如何生成主键(它将恰当你生成主键,不管你指定何种类型,但你必须告诉它)。...Visual Studio.Net 不会重新编译有改变映射文件。 第四步:数据库产生一个配置文件 我们至今还没有告诉NHibernate 去哪里连接数据库。

60930

LINQ在开发中地位?

但是依然没有将数据库持久化数据映射领域对象,所以还是一种针对数据库编程模型。 LINQ是微软将在C# 3.0中将推出语言集成查询技术,许多人也将LINQ叫做微软ORM。...=Object,也就是说他解决就是Data=Object.。作为底层框架,可以为ORM实现提供更强大基础平台。在Linq之前在.net领域最流行框架就是Nhibernate。...但是依然没有将数据库持久化数据映射领域对象,所以还是一种针对数据库编程模型。而Nhibernate则可以直接将关系数据映射领域模型,这是DLINQ主要问题。...DLINQ不支持继承类映射Nhibernate已经提供了许多帮助进行领域面向对象建模特征。而DLINQ目前还无法拥有。...开源社区可以做一个.net framework这样大东西Mono,开源社区这些闪烁创造性思维火花也沉闷软件开发带来了很多灵气。

1.4K60

NHibernate介绍「建议收藏」

要注意是所有需要持久化属性必须是虚拟,并且要开启延迟加载,所有数据模型类中公共方法必须是虚拟,哪怕它们并没有包含到映射文件中。 通常来讲,最好把所有的属性都设置虚拟。...创建NHibernate映射文件 Nhibernate使用XML映射文件来映射POCO到数据库对象。虽然在很多案例中这可能是一对一关系,但这并不是必定。...class元素表示到单个POCO映射。name表示上面的程序集和命名空间中类名,table属性告诉NHibernate数据库中哪个表或者视图将被映射。...id元素告诉NHibernate哪个数据库字段和对应对象作为一个唯一键来使用。在本例中,我们使用Id这个字段。 generator元素告诉NHibernate怎样给新实体来创建唯一ID。...一旦XML文件创建好了,需要更改XML生成方式确保它被设置嵌入式资源,否则NHibernate不会读取这个XML文件,那么映射就不会生效了。

64120

NHibernate 代码映射实体类

NHibernate 代码映射实体类 关于代码映射 NHibernate 3.2 自带了代码映射机制, 作为 xml 映射之外一种映射方式, 由于推出时间比较晚, 所以资料相对比较少, 而且与社区版...下面就通过一个实例来说明怎么使用 NHibernate 自带代码映射。 实体关系 要映射类关系图如下: ?...; 标识映射 使用 Id 函数映射标识, NHibernate 提供了内置工具类来简化代码: Id( m => m.Id, map => { map.Column("id...使用 Property 函数映射属性, NHibernate 提供了内置工具类来简化代码: Property( m => m.Name, map => { map.Column...Attribute Mapping 相比, 对原来 POCO 实体类没有污染 (Attribute) ; NHibernate 自带, 可以说是一等公民, 而 Fluent Mapping 是第三方维护

88910

Fluent NHibernate之旅(四)-- 关系(上)

Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence...Mapping 今天我们将说一下ORM中R映射,我们现在数据库大多都是关系型数据库了,所以可以说关系在我们数据库设计中也是非常重要部分,NHibernate也非常重视这一块,但在传统方式中,配置就比较麻烦...数据库关系 数据库关系一般有: 1、一对一 2、一对多 3、多对多 开始 结合我们前三个系列示例,我们这一次加一个用户表[User],目的就是存储用户信息所用,再加一个UserDetail,作为用户详细信息...映射 Fluent NHibernate 映射代码: public class UserMap : ClassMap { public UserMap() {...,却会抛出异常,因为NHibernate不支持one-to-oneLazy特性,也就是说NHibernate不支持一对一延迟加载。

1.2K60

C# 数据操作系列 - 12 NHibernate增删改查

NHibernate映射文件 对于NHibernate映射文件有个约定名字: .hbm.xml 这里先为大家介绍一下映射文件格式: 1.1 hibernate-mapping 说明 <hibernate-mapping...assembly:指定映射对象所在assembly,一般情况指的是项目名称 namespace:所在命名空间 default-access:可选,默认是property,表示NHibernate读取数据列策略...接下来,让我们探索class如何映射。 1.2.1 id 任何一个映射都必须声明一个数据表主键,大多数类也必须有一个唯一标示字段用来区分不同实例。...,不同地方在于一对一需要在双方映射关系里均要维护,在有外键表/实体中 添加 constrained=“true”。...增删改查 Nhibernate每次操作都基于一个Session,所以我们在操作数据库时候最好先持有一个可用Session。接下来,我们就一个通用数据库操作类基础,向大家分享一下我想法。

1.1K20
领券