zoukankan      html  css  js  c++  java
  • 使用NHibernate(3)-- 用代码代替配置文件

    1,用代码配置Configure类。

    上一篇“让代码跑起来”中,是通过在Web.config配置来实现Configure类的,NHibernate还提供了代码的方式。

    把之前的配置都注释掉,然后修改Application_Start中创建SessionFactory的代码如下:

    var configure = new Configuration()

                        .DataBaseIntegration(dbi =>

                        {

                            dbi.Dialect<MsSql2008Dialect>();

                            dbi.Driver<SqlClientDriver>();

                            dbi.ConnectionProvider<DriverConnectionProvider>();

                            dbi.ConnectionStringName = "SqlServer";

                        });

      configure .AddAssembly("NHibernateDemo") ;

      SessionFactory = configure.BuildSessionFactory();

    以上的代码中,先创建了一个Configuration类的实例,然后调用DataBaseIntegration方法,设置要使用的数据库方言、驱动、连接管理、连接字符串;通过AddAssembly添加了当前的程序集,NHibernate会在这个程序集中寻找映射文件(User.hbm.xml)。

    此时,运行下代码,完好如初。

    2,用代码配置实体映射。

    实体的映射文件,即User.hbm.xml也可以通过代码的方式实现。

    删除User.hbm.xml,然后添加一个UserMap类,具体代码如下:

        public class UserMap : ClassMapping<User>

        {

            public UserMap()

            {

                Table("NH_User");

                Id<long>(u => u.Id, map =>

                    {

                        map.Column("Id");

                        map.Generator(Generators.Native);

                    });

                Property<string>(u => u.Name);

            }

        }

    映射类必须继承泛型类ClassMapping。在构造函数中,通过Table方法指定User类对应的数据表,如果不指定,则默认的表和实体类名一致;Id方法配置主键,指定Id为主键,并且指定的类型为long,映射到数据表的Id列;Generators.Native代表数据库主键自增的方式初始化主键的值,也可以自己实现初始化器并在此指定;普通的属性使用Property配置,对于User.Name,因为和表列明一致,所以没有指定对应的列。

    因为使用代码来是新实体的映射,就不能再用 configure .AddAssembly("NHibernateDemo") 的方式来注册映射了,于是把这句代码用如下内容替换:

                ModelMapper mapper = new ModelMapper();

                mapper.AddMapping<UserMap>();

                HbmMapping mapping = mapper.CompileMappingFor(new[] { typeof(User) });

                configure.AddDeserializedMapping(mapping,null);

    现在,运行下代码,访问 /User/UserList,一切正常。

    3,使用Attribute的方式配置实体映射。

    如果觉得代码配置映射的方式还不够拉风,还有第三种方式,使用注解。

    NHibernate本身并没有提供这种功能,是在contrib中实现的,项目地址:http://sourceforge.net/projects/nhcontrib/files/NHibernate.Mapping.Attributes/

    使用之前需要先用NuGet或以下命令实现对NHibernate.Mapping.Attributes的引用: PM> Install-Package NHibernate.Mapping.Attributes

    把UserMap类注释掉,然后给User类使用注解,代码如下:

    [Class(Table = "NH_User")]

        public class User

        {

            [Id(1, Name = "Id", TypeType = typeof(long), Column = "Id", UnsavedValue = "0")]

            [Generator(2, Class = "native")]

            public virtual long Id { get; set; }

            [PropertyAttribute(Column = "Name", TypeType = typeof(string))]

            public virtual string Name { get; set; }

        }

    Class和User.hbm.xml中的节点对应,同理,Id和Property及这两个注解的属性也都是和之前的xml文件对应的,效果也是同样的。因为NHibernate.Mapping.Attributes的原理就是通过反射生成xml文件流,然后添加到Configuration实例中。如果用惯了xml的方式配置映射,我们甚至可以把生成的xml流保存成xml文件来查看配置是否有问题。

    对于Id的注解,第一个参数我传的是一个int类型的值,这个值是为了有多个注解时候,标明注解的顺序,即生成xml流的时候对应节点的先后顺序。

    每个注解还有其他很多没涉及到的属性,但名称都非常直观,就不在此赘述了。

    因为使用Attributes,向Configuration类注册映射的方式也得换一种,注释掉第2步中添加的Application_Start中的代码,然后添加下面这句代码:

    configure.AddInputStream(HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly()));

    因为实体就在当前的类中,所以调用HbmSerializer.Default.Serialize方法,把当前的程序集序列化到内存中,并把内存流通过AddInputStream添加到configure实例中。

    此时,运行代码,浏览器访问,一切正常。

  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/FuzhePan/p/3652163.html
Copyright © 2011-2022 走看看