使用NHibernate3.0来构建自己的ORM框架(一)

1. Library文件

  需要的dll文件如下:

  FluentNHibernate.dll (*)

  NHibernate.ByteCode.Castle.dll (*)

  NHibernate.dll (*)

  Remotion.Data.Linq.dll

  Antlr3.Runtime.dll

  Castle.Core.dll

  Iesi.Collections.dll

 

2. 创建Hibernate访问通用类

using System;
using System.Collections.Generic;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using NHibernate.Linq;
using System.Linq;

namespace CsharpTrainer.NHibernate3
{
    public class NHibernateDb<TMap> : IDisposable
    {
        private string connString;
        private ISessionFactory sessFactory;
        private ISession session;

        public ISessionFactory SessionFactory
        {
            get { return sessFactory; }
            set { sessFactory = value; }
        }

        public ISession Session
        {
            get { return session; }
            set { session = value; }
        }

        public void Dispose()
        {
            session.Dispose();
        }

        public NHibernateDb(string pStr)
        {
            connString = pStr;
            sessFactory = CreateSessionFactory();
            session = sessFactory.OpenSession();
        }

        ~NHibernateDb()
        {
            try
            {
                Dispose();
            }
            catch 
            {
                Console.WriteLine("Exception: session dispose failed!");
            }
        }

        private ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
                .Database(MsSqlConfiguration
                              .MsSql2008
                              .ConnectionString(connString))
                .Mappings(m => m.FluentMappings
                                   .AddFromAssemblyOf<TMap>())
                .BuildSessionFactory();
        }
        
        private void CreateSchema(Configuration cfg)
        {
            var schemaExport = new SchemaExport(cfg);
            schemaExport.Drop(false, true);
            schemaExport.Create(false, true);
        }

        public void CreateDatabase()
        {
            Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connString))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<TMap>())
                .ExposeConfiguration(CreateSchema)
                .BuildConfiguration();
        }
    }
}

 

3. 创建表格对应的实体类

  我们以Northwind数据库的Employees表格为例

using System;

namespace CsharpTrainer.NHibernate3.Entities
{
    public class Employees
    {
        public virtual int EmployeeID { get; set; }
        public virtual string LastName { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string Title { get; set; }
        public virtual DateTime BirthDate { get; set; }
        public virtual string Address { get; set; }
        public virtual string City { get; set; }
        public virtual string Region { get; set; }
        public virtual string Country { get; set; }
        public virtual string Notes { get; set; }

        public override string ToString()
        {
            string format = "Employee ID: {0}\nLast Name: {1}\n"
                          + "First Name: {2}\nTitle: {3}\nBirth Date: {4}\n"
                          + "Address: {5}\nCity: {6}\nRegion: {7}\nCountry: {8}\n"
                          + "Notes: {9}\n";

            return string.Format(format, EmployeeID, LastName, FirstName,
                                    Title, BirthDate, Address, City, Region, Country, Notes);
        }
    }
}

 

4. 建立映射关系(映射类)

  EmployeeMap Class:

using FluentNHibernate.Mapping;
using CsharpTrainer.NHibernate3.Entities;

namespace CsharpTrainer.NHibernate3.Mapping
{
    public class EmployeeMap : ClassMap<Employees>
    {
        public EmployeeMap()
        {
            Id(x => x.EmployeeID, "EmployeeID");
            Map(x => x.LastName)
                .Length(20)
                .Not.Nullable();
            Map(x => x.FirstName)
                .Length(10)
                .Not.Nullable();
            Map(x => x.Title)
                .Length(30);
            Map(x => x.BirthDate);
            Map(x => x.Address)
                .Length(60);
            Map(x => x.City)
                .Length(15);
            Map(x => x.Region)
                .Length(15);
            Map(x => x.Country)
                .Length(15);
            Map(x => x.Notes);
        }
    }
}

 

5. 客户端查询代码

  查询所有的员工,按照LastName排序

 

public void Run()
        {
            string connStr = ConfigurationManager.ConnectionStrings["NorthwindConnStr"].ConnectionString;

            try
            {
                NHibernateDb<EmployeeMap> db = new NHibernateDb<EmployeeMap>(connStr);

                ISessionFactory factory = db.SessionFactory;
                using (var session = factory.OpenSession())
                {
                    var employees = session.QueryOver<Employees>()
                                    .OrderBy(a => a.LastName).Asc
                                    .List();
                    Console.WriteLine("All Employees Below:");
                    foreach (var employee in employees)
                    {
                        Console.WriteLine(employee);
                    }
                }
                
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.ToString());
            }
        }

 

时间: 2024-10-31 04:38:48

使用NHibernate3.0来构建自己的ORM框架(一)的相关文章

.NETORM框架设计(利用抽象、多态实现无反射的绿色环保ORM框架)

最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是按照人头来衡量软件的技术含量是不可靠的.所以我们在选择跳巢的时候是选择大公司还是选择有技术含量的公司要根据自己的职业规划来.(本人最近体会到的一点跳巢经验分享给大家) 由于我现有单位技术部门刚刚成立不久,需要一些基础的开发框架,ORM当然是跑不了的.在后面的文章中我将陆续写下我在建设基础框架中的一些

[Android]Android端ORM框架——RapidORM(v1.0)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html    Android上主流的ORM框架有很多,常用的有ORMLite.GreenDao等. ORMLite: -优点:API很友好,使用比较方便简单稳定,相关功能比较完整. -缺点:内部使用反射实现,性能并不是很好. GreenDao: -优点:性能很不错, -缺点:API却不太友好,而且不支持复合主键,主键必须要有并且必须是long或者

[Android]Android端ORM框架——RapidORM(v2.0)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM框架--RapidORM(v2.0) RapidORM:Android端轻量高性能的ORM框架 GitHub: https://github.com/wangjiegulu/RapidORM 1. RapidORM v1.0 v1.0博客文档:http://www.cnblogs.com/tiant

NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber