NHibernate ConfORM Mapping


前言

  昨天寫了一篇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自帶的代碼映射方式同樣支持編寫規則映射,這樣在項目中會節約很多的時間,相比直接感覺還是用這個比較直接了,畢竟不需要引入第三方類庫。

此映射方式初次使用,若有不合理的地方,歡迎批評指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM