NHibernate初学者指南(6):映射模型到数据库之方式二
使用Fluent NHibernate自動映射
使用Fluent NHibernate自動映射,首先要將映射的實體放到一個命名空間中,這使得通知AutoMapper哪些實體和值對象包含在映射中更容易。建議在你的項目中創建一個Domain文件夾,將需要映射的實體和值對象放到這個文件夾中。
因為隱式映射實體和值對象,需要為AutoMapping定義約定和例外。我們通過實現一個繼承自DefaultAutomappingConfiguration的配置類實現。
假設我們已經將所有的實體和值對象放在了相同的命名空間中,這個命名空間只包含domain類,我們就可以如下面的代碼定義配置類:
public class OrderingSystemConfiguration : DefaultAutomappingConfiguration {public override bool ShouldMap(Type type){return type.Namespace == typeof(Customer).Namespace;} }上面的代碼告訴AutoMapping只映射那些和Customer實體有相同命名空間的類。
在AutoMapper工作之前,我們還需要告訴它更多的事情。我們必須告訴它在系統中誰是值對象。這可以在配置類中重寫IsComponent方法實現,如下面代碼所示:
public override bool IsComponent(Type type) {var componentTypes = new[] { typeof(Name), typeof(Address) };return componentTypes.Contains(type); }配置系統使用自動映射,我們利用下面的代碼:
var cfg = new OrderingSystemConfiguration(); var configuration = Fluently.Configure().Database(/* database config */).Mappings(m =>m.AutoMappings.Add(AutoMap.AssemblyOf<Employee>(cfg))).BuildConfiguration();?
實戰時間–使用自動映射
在這個例子中,我們想定義一個基本的領域模型,使用Fluent NHibernate提供的自動映射來映射我們的模型,然后讓NHibernate根據映射為我們生成數據庫架構:
1. 在VS中創建一個Console Application,名字為:AutoMappingSample。
2. 添加NHibernate.dll和FluentNHibernate兩個程序集到項目中。
3. 在項目中新建一個Domain文件夾。
4. 分別添加以下類到Domain文件夾中:
Customer類
namespace AutoMappingSample.Domain {public class Customer{public virtual int Id { get; set; }public virtual string CustomerName { get; set; }} }LineItem類
namespace AutoMappingSample.Domain {public class LineItem{public virtual int Id { get; set; }public virtual int Quantity { get; set; }public virtual decimal UnitPrice { get; set; }public virtual string ProductCode { get; set; }} }Order類
namespace AutoMappingSample.Domain {public class Order{public virtual int Id { get; set; }public virtual DateTime OrderDate { get; set; }public virtual Customer Customer { get; set; }public virtual IList<LineItem> LineItems { get; set; }} }5. 在項目中添加一個OrderingSystemConfiguration類,繼承自DefaultAutomappingConfiguration。
6. 重寫ShouldMap方法,如下面的代碼:
namespace AutoMappingSample {public class OrderingSystemConfiguration : DefaultAutomappingConfiguration{public override bool ShouldMap(Type type){return type.Namespace == typeof(Customer).Namespace;}} }7. 在Program類中添加如下using語句:
using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using FluentNHibernate.Automapping; using AutoMappingSample.Domain; using NHibernate.Tool.hbm2ddl;8. 添加下面的代碼到Program類的Main方法創建NHibernate配置。配置對象使用Fluent NHibernate的配置API創建用于自動映射。
var cfg = new OrderingSystemConfiguration(); var configuration = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008).Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>(cfg))).BuildConfiguration();注意為這個操作定義數據庫字符串沒有必要,因為我們不訪問數據庫,只是告訴NHibernate哪種類型的數據庫。
9. 添加下面的代碼創建并在控制臺上顯示SQL腳本:
var exporter = new SchemaExport(configuration); exporter.Execute(true, false, false);10. 添加下面的代碼避免程序不經確認就退出:
Console.WriteLine("按回車退出:"); Console.ReadLine();11. 運行程序,控制臺輸出如下:
使用ConfORM自動映射
ConfORM是NHibernate contributions的一部分,可從http://code.google.com/p/codeconform/downloads/list下載。確保下載的版本兼容你使用的NHibernate版本。
和Fluent NHibernate的AutoMapper一樣,ConfORM使用約定隱式定義領域模型的映射。這些約定可以重寫,也可以定義我們自己的約定。
實戰時間–使用ConfORM映射模型
在這個例子中,我們再一次創建一個簡單的領域模型并使用ConfORM為我們創建一個隱式的映射。然后我們使用NHiernate的schema exporter創建SQL腳本來創建兼容我們模型的數據庫架構。
1. 打開VS,創建一個Console Application項目,名字為:ConfORMSample。
2. 添加對NHibernate.dll和ConfORM.dll程序集的引用到項目中。我使用的NHibernate版本是3.1的,所以ConfORM也是兼容3.1的ConfORM 1.0.1.5。
3. 在項目中創建一個Domain文件夾。
4. 添加上一個例子中的Customer,Order和LineItem類到Domain文件夾。
Customer類
namespace ConfORMSample.Domain {public class Customer{public virtual int Id { get; set; }public virtual string CustomerName { get; set; }} }Order類
namespace ConfORMSample.Domain {public class Order{public virtual int Id { get; set; }public virtual DateTime OrderDate { get; set; }public virtual Customer Customer { get; set; }public virtual IList<LineItem> LineItems { get; set; }} }LineItem類
namespace ConfORMSample.Domain {public class LineItem{public virtual int Id { get; set; }public virtual int Quantity { get; set; }public virtual decimal UnitPrice { get; set; }public virtual string ProductCode { get; set; }} }5. 在Program類中添加如下using語句:
using ConfORMSample.Domain; using ConfOrm; using ConfOrm.NH; using NHibernate.Cfg; using NHibernate.Cfg.Loquacious; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Tool.hbm2ddl;6. 在Program類的Main方法中,使用NHibernate提供的fluent配置API創建一個NHibernate配置對象:
var configuration = new Configuration(); configuration.DataBaseIntegration(db => {db.Dialect<MsSql2008Dialect>();db.Driver<SqlClientDriver>(); });7. 添加如下代碼,確定要映射的類型:
var types = typeof(Customer).Assembly.GetTypes().Where(t => t.Namespace == typeof(Customer).Namespace);8. 創建一個類型為ObjectRelationalMapper的實例,如下面的代碼所示:
var orm = new ObjectRelationalMapper();9. 告訴映射器,應該為每一個類型創建一個表,如下所示:
orm.TablePerClass(types);10. 創建映射,并將它們添加到配置對象,如下面的代碼所示:
var mapper = new Mapper(orm); var hbmMappings = mapper.CompileMappingFor(types); configuration.AddDeserializedMapping(hbmMappings, "MyDomain");11. 創建schema生成腳本,如下面的代碼所示:
var exporter = new SchemaExport(configuration); exporter.Execute(true, false, false);12. 同樣,添加下面的代碼為避免程序未經確認就退出:
Console.Write("按回車退出:"); Console.ReadLine();13. 運行程序,如下圖所示:
沒用編碼和少量的配置,我們就使系統為我們的領域模型創建了一個隱式的映射,并導出為可以創建數據庫架構的腳本。生成的腳本基于定義在ConfORM中的約定。所有的這些約定都可以重寫,也可以根據需要添加自己的約定。
自動映射到此為止,下一篇介紹XML映射。
總結
以上是生活随笔為你收集整理的NHibernate初学者指南(6):映射模型到数据库之方式二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到有鬼缠身是什么意思
- 下一篇: 梦到被毒蛇咬了什么意思周公解梦