前言
在以前的項目開發過程中使用nhibernate做完orm映射工具需要編寫大量的xml映射文件,項目過程中往往會因為一個字段等小小的映射錯誤而很難去發現問題所在而且非常繁瑣,后來我們的項目中采取了第三方的映射插件Nhibernate.Mapping.Attribute直接在實體類上標記生成映射文件,最近的新項目中打算使用fluent nhibernate,這個工具中提供了一個方法讓你不再需要去寫NHibernate的標准映射文件(.hbm.xml),而是可以把映射文件都使用C#來寫。這樣做,方便了我們的代碼重構,提供了代碼的易讀性,並精簡了項目代碼,今天抽空簡單學習一下,下面我們通過手動編寫實體類,映射,來生成數據庫。
實現
1、首先我們通過nuget包管理器添加fluent nhibernate的引用,安裝成功后會自動添加對nhibernate的引用。
2、編寫實體類,注意實體的屬性都是virtual
編寫Employee實體:
namespace FluentNH.Model { public class Employee { public virtual int Id { get; set; } public virtual string FirstName { get; set; } public virtual string Position { get; set; } public virtual Department EmployeeDepartment{get;set;} } }
編寫Department實體:
namespace FluentNH.Model { public class Department { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string PhoneNumber { get; set; } } }
3、實體類編寫完成以后我們用代碼的方式實現對兩個實體的映射
Department映射:
namespace FluentNH.Mapping { class DepartmentMap : ClassMap<Department> { public DepartmentMap() { Id(x => x.Id); Map(x => x.Name); Map(x => x.PhoneNumber); Table("Department"); } } }
EmployeeMap映射:
class EmployeeMap : ClassMap<Employee> { public EmployeeMap() { Id(x => x.Id); Map(x => x.FirstName); Map(x => x.Position); References(x => x.EmployeeDepartment).Column("DepartmentId"); Table("Employee"); } }
實體類及映射代碼完成以后,若有任何一點改動我們需要在此修改。在映射文件構造函數里面的方法Map映射某一屬性到表里面的列,References多對一的關系並制定生成列的名稱,Tabel是指生成的表的名稱。
4、編寫輔助類配置Fluent nhiberate生成數據庫及表結構
public class NHibernateHelper { private static ISessionFactory _sessionFactory; private static ISessionFactory SessionFactory { get { if (_sessionFactory == null) InitializeSessionFactory(); return _sessionFactory; } } private static void InitializeSessionFactory() { _sessionFactory = Fluently.Configure() //配置數據庫 .Database(MsSqlConfiguration.MsSql2008 //指定連接字符串,也可寫在配置文件中 .ConnectionString( @"Server=(local);initial catalog=nhibernate; user=sa;password=123456;") .ShowSql()//顯示sql語句 ) //指定需要映射的程序集 .Mappings(m => m.FluentMappings .AddFromAssemblyOf<Program>()) .ExposeConfiguration( //配置生成數據庫及表結構 cfg => new SchemaExport(cfg).Create(true, true)) //創建session工廠 .BuildSessionFactory(); } public static ISession OpenSession() { return SessionFactory.OpenSession(); } }
具體配置可參考fluent nhibernate的api,也可參考文中代碼注釋。
5、在控制台程序中測試以上配置
class Program { static void Main(string[] args) { using (var session = NHibernateHelper.OpenSession()) { using (var transaction = session.BeginTransaction()) { var DepartmentObject = new Department { Name = "狼性法則", PhoneNumber = "18254241255" }; session.Save(DepartmentObject); transaction.Commit(); Console.WriteLine("Department保存成功" + DepartmentObject.Name); Console.ReadKey(); } } } }
運行程序,打開數據庫查詢生成的表結構,並可以在控制台中查看sql語句,如圖。
可以看到生成的數據庫及語句,但我們可以發現存在一些問題如,數據庫中列的長度等,這些也是可以在映射文件配置中設定的,本文由於是對fluent nhibernate的初始也沒考慮太多,基本使用實例就此完成。