使用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();
}
}
}
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);
}
}
}
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);
}
}
}
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());
}
}
{
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());
}
}
技术改变世界