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. using NHibernate.Cfg;
  6. using NHibernate.Dialect;
  7. using NHibernate.Driver;
  8. using NHibernate.Mapping.ByCode;
  9. namespace DiPiPi.Mvc3.Orm
  10. {
  11. public static class NHibernateCfg
  12. {
  13. private const string _ConnectionString =
  14. @"Data Source=localhost;Initial Catalog=DiPiPiDB;Integrated Security=True;Pooling=False";
  15. public static Configuration GetConfiguration()
  16. {
  17. var configure = new Configuration();
  18. configure.SessionFactoryName("DiPiPiDB");
  19. configure.DataBaseIntegration(db =>
  20. {
  21. db.Dialect<MsSql2005Dialect>();
  22. db.Driver<SqlClientDriver>();
  23. db.ConnectionString = _ConnectionString;
  24. });

ISessionManager 代码:

Code Snippet

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

SessionManager 代码:

Code Snippet

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

UserInfo 实体类代码:

Code Snippet

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

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. using NHibernate.Mapping.ByCode;
  6. using NHibernate.Mapping.ByCode.Conformist;
  7. namespace DiPiPi.Mvc3.Orm
  8. {
  9. /// <summary>
  10. /// http://taven.cnblogs.com
  11. ///
    李锡远的博客
  12. ///
    实体映射类
  13. /// </summary>
  14. public class UserInfoMap : ClassMapping<UserInfo>
  15. {
  16. public UserInfoMap()
  17. {
  18. Id(entity => entity.UserId, map =>
  19. {
  20. map.Column("UserInfoID");
  21. map.Generator(Generators.Identity);
  22. });
  23. Property(entity => entity.UserName, map => map.Length(150));

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

Code Snippet

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

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

Code Snippet

  1. ISessionManager session = new SessionManager();
  2. 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. userinfoR.Save(u);
  8. }

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

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

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




本文转自远哥博客园博客,原文链接:cnblogs.com/taven/,如需转载请自行联系原作者

相关文章
|
XML 测试技术 C#
C#——Nhibernate探索
C#—Nhibernate探索 本篇文章,让我们一起来探索Nhibernate。 首先我们去搜索Nhibernate下载地址,如下链接所示。 该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。
2404 0
|
Web App开发 前端开发 数据库