搭建NHibernate3.2+CodeFirst映射框架

所用程序集:

   1,Iesi.Collections:NHibernate依赖项,用来进行集合运算。

2,NHibernate:版本3.2.0.4000,面向.NET环境的对象/关系数据库映射工具,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

3,ConfOrm:版本2.000,ConfORM是NHibernate贡献者Fabio Maulo大牛设计的,是一个配置ORM的工具,其接口按照ORM思想定义,基于GNU Lesser General Public License协议。其设计思想来源就是 ORuM(Object Relational un-Mapping)。它按照Domain定义帮助我们"自动"实现Mapping。现在仅仅实现了对NHibernate的"自动"Mapping。

映射步骤:

  1,定义实体类Student.cs

public class Student
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual int Sex { get; set; }
        public virtual int StuId { get; set; }
    }

2,ConfOrm配置:

这一步非常重要,是ConfORM的核心所在,实例化一个ObjectRelationalMapper对象,装配实体类对象,实例化Mapper对象,调用Mapper对象的CompileMappingFor()方法自动生成HbmMapping。

 public class MappingFactory
    {
        public HbmMapping CreateMapping()
        {
            var orm = new ObjectRelationalMapper();
            //主键生成策略
            orm.Patterns.PoidStrategies.Add(new NativePoidPattern());
            orm.TablePerClass(new[] { typeof(Student), typeof(NewStudent) });
            //实体关系映射
            //orm.ManyToOne<Student, Class>();
            //继承映射
            //mapper.JoinedSubclass<DatabaseTable>(cm => { cm.Key(k => { k.Column("Id"); }); });
            //mapper.JoinedSubclass<ExcelTable>(cm => { cm.Key(k => { k.Column("Id"); }); });

            //属性约束映射
            //CommonPropertyMapper(ref mapper);
            //EntityPropertyMapper(ref mapper);
            var mapper = new Mapper(orm);
            var hc = mapper.CompileMappingFor(Assembly.Load(typeof(Student).Namespace).GetTypes());
            return hc;
            //return mapper.CompileMappingFor(new[] { typeof(Student) });
        }

        ///// <summary>
        ///// 公共属性约束映射
        ///// </summary>
        ///// <param name="mapper"></param>
        //private void CommonPropertyMapper(ref Mapper mapper)
        //{
        //    //DBType mapping
        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(bool),
        //        pm => { pm.Column(cm => cm.SqlType("bit")); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(decimal),
        //        pm => { pm.Column(cm => cm.SqlType("decimal(18,2)")); });

        //    //mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(DateTime),
        //    //    pm => { pm.Column(cm => cm.SqlType("nvarchar(30)")); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(bool?),
        //        pm => { pm.Column(cm => cm.SqlType("bit")); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Email"),
        //        pm => { pm.Length(100); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("MobilePhone"),
        //        pm => pm.Length(100));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("TelPhone"),
        //        pm => pm.Length(100));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Remark"),
        //        pm => pm.Length(1000));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Description"),
        //        pm => pm.Length(1000));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Summary"),
        //        pm => pm.Length(200));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Details"),
        //        pm => pm.Length(1000));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Equals("Detail"),
        //        pm => pm.Length(8000));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Equals("Name", StringComparison.CurrentCultureIgnoreCase),
        //        pm => { pm.Length(100); pm.NotNullable(true); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Equals("Account"),
        //        pm => { pm.Length(32); pm.NotNullable(true); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Num"),
        //        pm => { pm.Length(30); pm.NotNullable(true); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Unit"),
        //        pm => { pm.Length(10); pm.NotNullable(true); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Password"),
        //        pm => { pm.NotNullable(true); });

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("State"),
        //        pm => pm.NotNullable(true));

        //    mapper.AddPropertyPattern(mi => mi.GetPropertyOrFieldType() == typeof(string) && mi.Name.Contains("Address"),
        //        pm => pm.Length(200));

        //}

        ///// <summary>
        ///// 实体属性约束映射
        ///// </summary>
        ///// <param name="mapper"></param>
        //private void EntityPropertyMapper(ref Mapper mapper)
        //{
        //    mapper.Class<Goods>(cm =>
        //    {
        //        cm.Property(q => q.Details, pm =>
        //        {
        //            pm.Length(int.MaxValue);
        //        });
        //    });

        //}
    }

3,读取配置:

这一步关键环节是调用Configuration对象的AddDeserializedMapping()方法添加HbmMapping和配置元数据。

 public static class NhConfig
    {
        private static readonly ISessionFactory _sessionFactory;
        private static Configuration _configuration;

        static NhConfig()
        {
            try
            {
                _configuration = new Configuration();
                var mapping = new MappingFactory().CreateMapping();
                _configuration.AddDeserializedMapping(mapping, null);
                var a = _configuration.Configure();
                _sessionFactory = a.BuildSessionFactory();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static Configuration Configuration
        {
            get { return _configuration; }
        }

        public static ISessionFactory SessionFactory
        {
            get { return _sessionFactory; }
        }
    }

4,运行方法进行映射:

  public class MappingTestController : Controller
    {
        //
        // GET: /MappingTest/

        public ActionResult Index()
        {
            try
            {
                var update = new SchemaUpdate(NhConfig.Configuration);
                update.Execute(true, true);
            }
            catch (Exception)
            {

                throw;
            }

            return View();
        }

    }

配置文件web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" />
  </configSections>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

  </appSettings>
  <connectionStrings>
    <add name="connection_string" connectionString="Data Source=.;Initial Catalog=SCB;User ID=sa;Password=123123;" />
  </connectionStrings>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="NHibernate.Test">
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string_name">connection_string</property>
      <property name="adonet.batch_size">10</property>
      <property name="show_sql">false</property>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="command_timeout">60</property>
      <property name="query.substitutions">true 1, false 0, yes ‘Y‘, no ‘N‘</property>
    </session-factory>
  </hibernate-configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.3.1.4000" newVersion="3.2.0.4000" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.serviceModel>
    <bindings />
    <client />
  </system.serviceModel>
  <system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>
时间: 2024-10-31 00:03:41

搭建NHibernate3.2+CodeFirst映射框架的相关文章

hibernate环境搭建(二)——映射框架配置

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="co

Hibernate(开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

如何搭建一个简易的Web框架

Web框架本质 什么是Web框架, 如何自己搭建一个简易的Web框架?其实, 只要了解了HTTP协议, 这些问题将引刃而解. 简单的理解:  所有的Web应用本质上就是一个socket服务端, 而用户的浏览器就是一个socket客户端. 用户在浏览器的地址栏输入网址, 敲下回车键便会给服务端发送数据, 这个数据是要遵守统一的规则(格式)的, 这个规则便是HTTP协议. HTTP协议主要规定了客户端和服务器之间的通信格式 浏览器收到的服务器响应的相关信息可以在浏览器调试窗口(F12键开启)的Net

Hibernate (开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

CentOS 6.5上搭建Nginx和配置DWZ框架

前言 原创文章欢迎转载,请保留出处. 若有任何疑问建议,欢迎回复. 邮箱:[email protected] 今天搜索了下,发现并没有类似的文章,虽然比较简单,但还是写个博文记录下,主要讲述如何搭建Nginx和配置DWZ框架. 安装Nginx 首先安装Nginx必须要的库,直接yum安装就行了,注意要在root权限下执行. yum install pcre yum install openssl yum install zlib 接下来安装Nginx,为了免得麻烦,我也打算用yum安装,不过由于

开源实体映射框架EmitMapper介绍

开源实体映射框架EmitMapper介绍 综述 EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/. EmitMapper映射效率比较高,接近硬编码.EmitMapper采用emit方式在运行时动态生成IL,而其他映射框架多是采用反射机制.此外EmitMapper最大限度地减少了拆箱装箱操作和映射过程中的额外的调用. EmitMapper支持.net的所有平台:Framework 3.5.Microsoft Silverlight 3

iOS之UI--主流框架的搭建-- 仿制QQ的UI框架

iOS之UI--主流框架的搭建-- 仿制QQ的UI框架 使用XCode搭建多个控制器界面,一般在实际开发中建议超过四个控制器界面使用纯代码. 下面的实例其实已经超过了四个,总结详细步骤的目的,主要是更熟悉XCode的StoryBoard使用细节. 先直接上我们这个主流框架要达到的效果: 首先我们需要设置应用程序的图标: 素材百度云链接: http://pan.baidu.com/s/1dEqz7Vj 密码: g34e 然后是设定应用程序启动界面的素材百度云链接: http://pan.baidu

Hibernate (开放源代码的对象关系映射框架)介绍

Hibernate (开放源代码的对象关系映射框架) 编辑 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hiberna

如何搭建一个合理的数值框架

转自:http://www.gameres.com/749634.html 如何搭建一个合理的数值框架? 1.拍脑袋定下一系列的数值设定,完成所有数值框架的设定 2.数值检验,模拟计算重要参数,来确定数值框架是否合理 针对第一个要点,关键在于我们需要定哪些关键数值设定,以及如何来“拍” 针对第二个要点,关键在于我们需要哪些参数来验证数值框架是否合理,以及这些参数是否足以验证数值框架的合理性 一.我提出一些我们可能需要“拍”的数值设定 1.主线成长与付费成长比例 2.主线成长和付费成长分别包含了几