NHibernate 3.2 使用 Conformist 进行 CodeFirst 开发

NHibernate 3.2 GA 正式版于 2011-07-30 发布,这一版本对 CodeFirst 的支持性更好了,因为它提供了 Conformist 取代之前第三方的 ConfOrm。

 

NHibernate 3.2 下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/

 

下面将讲一下如何使用这一新成员进行数据库的基本操作。我使用的开发环境是:VS2010 + NHibernate 3.2 + MVC 3,下面是项目目录图:

 

 

 

项目只要引用 “Iesi.Collections.dll” 和 “NHibernate.dll” 两个类库文件即可。 

 

 NHibernateCfg 代码:

注意,“MsSql2005Dialect” 表示使用SQL 2005数据库,数据库名为“DiPiPiDB”。

 Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using NHibernate.Cfg;
  7. using NHibernate.Dialect;
  8. using NHibernate.Driver;
  9. using NHibernate.Mapping.ByCode;
  10.  
  11. namespace DiPiPi.Mvc3.Orm
  12. {
  13.     public static class NHibernateCfg
  14.     {
  15.         private const string _ConnectionString =
  16.         @"Data Source=localhost;Initial Catalog=DiPiPiDB;Integrated Security=True;Pooling=False";
  17.  
  18.         public static Configuration GetConfiguration()
  19.         {
  20.  
  21.             var configure = new Configuration();
  22.  
  23.             configure.SessionFactoryName("DiPiPiDB");
  24.             
  25.            
  26.             configure.DataBaseIntegration(db =>
  27.             {
  28.                 db.Dialect<MsSql2005Dialect>();
  29.                 db.Driver<SqlClientDriver>();
  30.                 db.ConnectionString = _ConnectionString;
  31.             });
  32.  
  33.             

 

 

 ISessionManager 代码:

 

 Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using NHibernate;
  7.  
  8. namespace DiPiPi.Mvc3.Orm
  9. {
  10.     public interface ISessionManager
  11.     {
  12.         ISessionFactory GetSession();
  13.  
  14.         void CreateDataTable();
  15.  
  16.         void DropDataTable();
  17.     }

 

SessionManager 代码:

 Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using NHibernate;
  7. using NHibernate.Cfg;
  8. using NHibernate.Cfg.MappingSchema;
  9. using NHibernate.Tool.hbm2ddl;
  10. using NHibernate.Mapping.ByCode;
  11.  
  12. namespace DiPiPi.Mvc3.Orm
  13. {
  14.     /// <summary>
  15.     /// 使用 NHibernate 操作数据库的Session
  16.     /// </summary>
  17.     public class SessionManager : ISessionManager
  18.     {
  19.         private Configuration conf = null;
  20.         private ISessionFactory sessionFactory = null;
  21.         private ModelMapper mapper = null;
  22.  
  23.         public SessionManager()
  24.         {
  25.             mapper = new ModelMapper();
  26.             conf = NHibernateCfg.GetConfiguration();
  27.  
  28.             LoadOrmMapping();
  29.  
  30.         }
  31.  
  32.         public Configuration GetConfiguration()
  33.         {
  34.  
  35.             return conf;
  36.  
  37.         }
  38.  
  39.         private void LoadOrmMapping()
  40.         {
  41.  
  42.             //在Configuration中添加HbmMapping
  43.             AddMapping<UserInfoMap>();
  44.  
  45.             var hbmMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
  46.             conf.AddMapping(hbmMapping);
  47.  
  48.             //Console.WriteLine(hbmMapping.AsString());
  49.  
  50.         }
  51.  
  52.  
  53.         private void AddMapping<TModel>() where TModel : IConformistHoldersProvider, new()
  54.         {
  55.  
  56.             mapper.AddMapping<TModel>();
  57.  
  58.         }
  59.  
  60.  
  61.  
  62.         public ISessionFactory GetSession()
  63.         {
  64.  
  65.             //配置数据库
  66.             SchemaMetadataUpdater.QuoteTableAndColumns(conf);
  67.  
  68.             //建立SessionFactory
  69.             sessionFactory = conf.BuildSessionFactory();
  70.  
  71.             return sessionFactory;
  72.         }
  73.  
  74.  
  75.  
  76.         public void CreateDataTable()
  77.         {
  78.  
  79.             //配置数据库
  80.             SchemaMetadataUpdater.QuoteTableAndColumns(conf);
  81.             //创建数据库
  82.             new SchemaExport(conf).Create(false, true);
  83.         }
  84.  
  85.         public void DropDataTable()
  86.         {
  87.  
  88.             //配置数据库
  89.             SchemaMetadataUpdater.QuoteTableAndColumns(conf);
  90.             //删除数据库
  91.             new SchemaExport(conf).Drop(false, true);
  92.         }
  93.  
  94.         public ISession OpenSession()
  95.         {
  96.             if (sessionFactory != null)
  97.             {
  98.                 return sessionFactory.OpenSession();
  99.             }
  100.             else
  101.             {
  102.                 return null;
  103.             }
  104.         }
  105.  
  106.         public void CloseSession()
  107.         {
  108.             if (sessionFactory != null)
  109.             {
  110.                 sessionFactory.Close();
  111.             }
  112.  
  113.         }
  114.  
  115.  
  116.     }
  117. }

 

 UserInfo 实体类代码:

  Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace DiPiPi.Mvc3.Orm
  7. {
  8.     public class UserInfo
  9.     {
  10.         public virtual int UserId { get; set; }
  11.  
  12.         public virtual string UserName { get; set; }
  13.  
  14.     }
  15. }

 

 UserInfoMap 实体映射类代码:

 注意,这里开始使用 Conformist 了,“Generators.Identity”表示主键为整型自增,如果是“Generators.Guid” 表示采用Guid方式,还有其他方式,大家可以去研究。

  Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using NHibernate.Mapping.ByCode;
  7. using NHibernate.Mapping.ByCode.Conformist;
  8.  
  9. namespace DiPiPi.Mvc3.Orm
  10. {
  11.     /// <summary>
  12.     /// http://taven.cnblogs.com
  13.     /// 

    李锡远的博客

  14.     /// 

    实体映射类

  15.     /// </summary>
  16.     public class UserInfoMap : ClassMapping<UserInfo>
  17.     {
  18.         public UserInfoMap()
  19.         {
  20.             Id(entity => entity.UserId, map =>
  21.                 {
  22.                     map.Column("UserInfoID");
  23.                     map.Generator(Generators.Identity);
  24.                 });
  25.  
  26.             Property(entity => entity.UserName, map => map.Length(150));
  27.  

 

 UserInfoRepository 数据库读取的仓储类代码:(这个类包含了数据库的 增、删、改 常用方法)

 Code Snippet

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using NHibernate.Criterion;
  7.  
  8. namespace DiPiPi.Mvc3.Orm
  9. {
  10.     public class UserInfoRepository
  11.     {
  12.         private ISessionManager sessionManage;
  13.  
  14.         public UserInfoRepository(ISessionManager _sessionManage)
  15.         {
  16.             sessionManage = _sessionManage;
  17.         }
  18.  
  19.         public List<UserInfo> FindAll()
  20.         {
  21.             using (var session = sessionManage.GetSession().OpenSession())
  22.             {
  23.                 var query = session.QueryOver<UserInfo>()
  24.                 .OrderBy(p => p.UserId).Asc
  25.                 .List();
  26.  
  27.                 return query.ToList();
  28.             }
  29.         }
  30.  
  31.         public List<UserInfo> Find(ICriterion condition)
  32.         {
  33.             using (var session = sessionManage.GetSession().OpenSession())
  34.             {
  35.                 var query = session.QueryOver<UserInfo>()
  36.                 .Where(condition)
  37.                 .OrderBy(p => p.UserId).Asc
  38.                 .List();
  39.  
  40.                 return query.ToList();
  41.             }
  42.         }
  43.  
  44.         public List<UserInfo> FindbyExample(UserInfo entity)
  45.         {
  46.             using (var session = sessionManage.GetSession().OpenSession())
  47.             {
  48.                 var query = session.CreateCriteria<UserInfo>().Add(Example.Create(entity)).List<UserInfo>();
  49.  
  50.                 return query.ToList();
  51.             }
  52.         }
  53.  
  54.         public void Save(UserInfo model)
  55.         {
  56.             using (var session = sessionManage.GetSession().OpenSession())
  57.             {
  58.                 using (var trans = session.BeginTransaction())
  59.                 {
  60.                     
  61.                     session.Save(model);
  62.                     trans.Commit();
  63.                 }
  64.             }
  65.         }
  66.  
  67.         public void Modify(UserInfo model)
  68.         {
  69.             using (var session = sessionManage.GetSession().OpenSession())
  70.             {
  71.                 using (var trans = session.BeginTransaction())
  72.                 {
  73.                     session.Update(model);
  74.                     trans.Commit();
  75.                 }
  76.             }
  77.         }
  78.  
  79.         public void Remove(UserInfo entity)
  80.         {
  81.             using (var session = sessionManage.GetSession().OpenSession())
  82.             {
  83.                 using (var trans = session.BeginTransaction())
  84.                 {
  85.                     session.Delete(entity);
  86.  
  87.                     trans.Commit();
  88.                 }
  89.             }
  90.         }
  91.  
  92.         public void RemoveByID(int Id)
  93.         {
  94.             using (var session = sessionManage.GetSession().OpenSession())
  95.             {
  96.                 using (var trans = session.BeginTransaction())
  97.                 {
  98.                     session.CreateQuery("delete UserInfo where UserId = :userId").SetInt32("userId", Id).ExecuteUpdate();
  99.  
  100.                     trans.Commit();
  101.                 }
  102.             }
  103.         }
  104.  
  105.         public void Removes(String userName

 

 

 将实体代码写好后,执行下面代码可直接创建数据库的表:

 Code Snippet

  1. ISessionManager session = new SessionManager();
  2.  
  3. session.CreateDataTable();

 

执行下面代码可插入数据:

 Code Snippet

  1. ISessionManager session = new SessionManager();
  2. UserInfoRepository userinfoR = new UserInfoRepository(session);
  3. for (var i = 0; i < 10; i++)
  4. {
  5.     UserInfo u = new UserInfo();
  6.     u.UserName = "

    远哥"

    +i;

  7.  
  8.     userinfoR.Save(u);
  9. }

 

执行下面代码可读取数据:

Code Snippet

  1. ISessionManager session = new SessionManager();
  2.  
  3. UserInfoRepository userinfoR = new UserInfoRepository(session);
  4. List<UserInfo> list = userinfoR.FindAll();

 

 

项目源码打包下载:http://files.cnblogs.com/taven/DiPiPiDemo.rar

 

 

时间: 2024-08-02 19:50:15

NHibernate 3.2 使用 Conformist 进行 CodeFirst 开发的相关文章

C#中 使用CodeFirst开发模式有什么好处,和先建数据库有什么区别

问题描述 C#中 使用CodeFirst开发模式有什么好处,和先建数据库有什么区别 C#中 使用**CodeFirst**开发模式有什么好处,和先建数据库有什么区别 解决方案 谈不上什么好处坏处,萝卜白菜各有所爱,你能说萝卜比白菜好在哪里,萝卜白菜有什么区别么? 如果你感受不到codefirst的好处,那说明对于你来说,codefirst没有好处.这很正常.就像有些开发者偏好于通过代码来进行领域建模而不是数据库他们觉得cf比通过数据库建模要好一样.这只是一种偏好(perference),

EF codefirst 开发环境与部署环境 如何更新数据库

问题描述 用EF的codefirst方式开发了一个网站.数据库的字段增加都是通过code去完成的,然后做数据库迁移.用生成数据库表dbo.__MigrationHistory的方法,在configuration.cs中设置AutomaticMigrationsEnabled=true;可以利用包管理工具然后命令:Update-database-verbose-force解决了每次修改数据库字段就重新dropdb,createdb的烦恼.but.....在部署好的网站中,怎么解决程序变了,需要改变

Oracle中使用Entity Framework 6.x Code-First方式开发

去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using NuGet to Install and Configure Oracle Data Provider for .NET 2.Entity Framework Code First and Code First Migrations for Oracle Database 基本上照着做就行了,为了方

福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!

距离"上次框架完整发布"已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手.     发布内容 注意,本次发布,只包含 Rafy 框架中的领域实体框架及相关文档.不包含"界面自动生成"等其它组件. 安装新的发布包:<使用 NuGet 下载最新的 Rafy 框架及文档>. 网页版用户手册(实时更新):<http://zgynhqf.github.io/Rafy>. 老版

Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案

去年4月,我们为 Rafy 框架添加了领域模型设计器组件.时隔一年,谨以本文,简要说明该领域模型设计器的设计思想.   设计目标 Rafy 实体框架中以领域驱动设计作为指导思想.所以在开发时,以领域建模为首要任务.为此,我们为它开发了领域模型设计器.开发人员可以在设计器中,设计相应的领域模型,查看现有代码对应的领域模型. 我们为这个设计器制定了以下功能: 外部简单设计器:也就是设计器可以部署为一个可以独立运行的软件.该软件可以打开领域模型的设计图,方便团队中的非开发人员角色查看.同样,这个软件最

Rafy 框架 - 为数据库生成注释

当开发者使用 CodeFirst 开发模式,编写了大量的实体类,在代码中编写了完整的类型注释和属性注释,并自动生成数据库后,往往需要把实体类型和实体属性上的注释同时生成到对应的数据库表及字段上.这样,即方便在查看数据库时能清晰地看到每一个表及字段的含义,也方便使用一些第三方的工具(如 PowerDesigner 等)为数据库生成较为全面的文档.   使用方法 在为数据库生成注释之前,需要保证数据库已经全部生成成功(即和实体保持一致).否则更新字段的注释时,可能因为字段不存在而导致执行失败. 需要

【ASP.NET Web API教程】2.3 与实体框架一起使用Web API

原文:[ASP.NET Web API教程]2.3 与实体框架一起使用Web API 2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web API 本小节是ASP.NET Web API第2章的第3小节,原文共分为7个部分,分成了7篇文章,故这里也分为7个帖子贴出,以下是本小节的第1部分 - 译者注. Part 1: Overview and Creating the Project 第1部分:概述及创建项目 本文引自:http://w

codefirst-EF环境,CodeFirst模式开发,同项目多个数据库,如何设定自动数据迁移

问题描述 EF环境,CodeFirst模式开发,同项目多个数据库,如何设定自动数据迁移 如题,我的整个工程比较复杂,有多个数据库,统一放在名为DataBase的类库项目下,供其他项目调用. 我的应用项目也有好几个,我想对每个项目单独设置自动迁移数据,现在发现有困难. 因为每次启动一个数据迁移,都是在同一个Migrations文件夹下,这个没有给我自定义名字的地方.并且启动文件都是Configuration.cs这个类,也没有给我自定义名字的地方. 也就是说,我一次只能设定一个数据库进行自动迁移.

使用C#+MVC+NHibernate开发Web怎么样?

问题描述 近来公司要开发一个运营网站,想使用C#+MVC+NHibernate组合进行开发,不知这个组合开发网站怎么样?各位兄弟给点意见,谢谢! 解决方案 解决方案二:不错,现在很多都采用的是Nhibernate来开发项目解决方案三:那样的话用monorail吧学习曲线比较陡峭做好准备解决方案四:比较不错哦,特别是小型项目解决方案五:为什么用NHibernate而不是.NET自带的EntityFramework呢?解决方案六:引用4楼stainboy的回复: 为什么用NHibernate而不是.