前言
昨天寫了一篇fluent nhibernate通過約定的代碼映射方式,NH在3.0版本以后已經集成了conform的代碼映射方式,一直沒注意也沒使用過,今天試試怎么樣。
步驟
1、通過conform方式生成如下數據庫架構
2、添加項目對NH3.3的引用,3.0以后已經集成代碼映射的方式在using NHibernate.Mapping.ByCode.Conformist;using NHibernate.Mapping.ByCode;命名空間中。
編寫持久化對象:
public class Province { public Province() { Cities = new List<City>(); } virtual public int Name{get;set;} virtual public int ProvienceID{get;set;} virtual public IList<City> Cities { get; set; } } public class City { virtual public int CityID{get;set;} virtual public int Name{get;set;} virtual public Province Province { get; set; } }
集成using NHibernate.Mapping.ByCode.Impl.CustomizersImpl;命名空間下的ClassMapping<T>來實現代碼配置持久化對象映射
Provience映射代碼:
public class ProvinceMap : ClassMapping<Province> { public ProvinceMap() { Id(p => p.ProvienceID, map => map.Generator(Generators.Assigned)); Property(p => p.Name); Bag(p => p.Cities, map => map.Key(k => k.Column("ProvinceId")), ce => ce.OneToMany()); } }
CIty類映射代碼:
public class CityMap : ClassMapping<City> { public CityMap() { Id(p => p.CityID, map => map.Generator(Generators.Assigned)); Property(p => p.Name); ManyToOne(p => p.Province, map => map.Column("ProvinceId")); } }
3、NH配置
首先我們添加一個數據庫連接的配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="NHConform" connectionString="Data Source=(local);initial catalog=NHConform;Integrated Security=SSPI"/> </connectionStrings> </configuration>
編寫一個配置NH的類:
public static class NHContext { public static Configuration NHConfiguration { get; set; } public static ISessionFactory SessionFactory { get; set; } public static void AppConfigure() { #region NHibernate配置 NHConfiguration = ConfigureNHibernate(); SessionFactory = NHConfiguration.BuildSessionFactory(); #endregion } private static Configuration ConfigureNHibernate() { var configure = new Configuration(); configure.SessionFactoryName("BuildIt"); configure.DataBaseIntegration(db => { //配置數據庫連接 db.Dialect<MsSql2008Dialect>(); db.Driver<SqlClientDriver>(); db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote; db.IsolationLevel = IsolationLevel.ReadCommitted; db.ConnectionStringName = "NHConform"; db.Timeout = 10; db.LogFormattedSql = true; db.LogSqlInConsole = true; db.AutoCommentSql = true; }); var mapping = GetMappings(); //在Configuration中添加HbmMapping configure.AddDeserializedMapping(mapping, "NHConfORM"); //配置元數據 SchemaMetadataUpdater.QuoteTableAndColumns(configure); return configure; } public static HbmMapping GetMappings() { var mapper = new ModelMapper(); mapper.AddMappings(Assembly.GetAssembly(typeof(ProvinceMap)).GetExportedTypes()); var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); return mapping; } }
4、測試映射配置生成數據庫架構,建了一個控制台程序沒有寫單元測試,生成數據庫架構的代碼
public static void Create() { NHContext.AppConfigure(); new SchemaExport(NHContext.NHConfiguration).Create(false, true); }
在控制台主程序中執行Create()方法,生成數據庫並生成如上圖的數據庫關系圖。
測試刪除數據庫:
public static void Drop() { NHContext.AppConfigure(); new SchemaExport(NHContext.NHConfiguration).Drop(false, true); }
執行Drop()方法以后數據庫結構就被刪除了,此處就不截圖了。
結語
NH自帶的代碼映射方式同樣支持編寫規則映射,這樣在項目中會節約很多的時間,相比直接感覺還是用這個比較直接了,畢竟不需要引入第三方類庫。
此映射方式初次使用,若有不合理的地方,歡迎批評指正。