天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

NHibernate3剖析:Mapping篇之ConfORM實(shí)戰(zhàn)(1):概覽

  ORuM思想浮出

  對(duì)于ORM(Object Relational Mapping)我們太熟悉了,但是我們從另一個(gè)角度可以想象出ORuM(Object Relational un-Mapping)的思想理念。我們?cè)诔绦蛑袃H僅定義Domain,而想有個(gè)工具可以幫助我們"自動(dòng)化"實(shí)現(xiàn)Mapping,我們無(wú)需按傳統(tǒng)的ORM思想那樣為Domain手動(dòng)編碼Mapping。

  ORuM對(duì)于使用者來(lái)說(shuō)更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-Relational Intelligent-Mapping)的意思。

  有沒(méi)有這樣的實(shí)現(xiàn)呢?答案是相當(dāng)肯定的。

  ConfORM概述

  ConfORM是NHibernate貢獻(xiàn)者Fabio Maulo大牛設(shè)計(jì)的,是一個(gè)配置ORM的工具,其接口按照ORM思想定義,基于GNU Lesser General Public License協(xié)議。其設(shè)計(jì)思想來(lái)源就是ORuM(Object Relational un-Mapping)。它按照Domain定義幫助我們"自動(dòng)"實(shí)現(xiàn)Mapping。現(xiàn)在僅僅實(shí)現(xiàn)了對(duì)NHibernate的"自動(dòng)"Mapping,如果有興趣的話,可以添加對(duì)EF實(shí)現(xiàn)自動(dòng)Mapping功能。

  那么ConfORM到底如何"自動(dòng)"的呢?

  NHibernate對(duì)Mapping的處理過(guò)程,就是將XML文件反序列化為HbmMapping類,再將HbmMapping類Bind為Mappings,最后Bind SessionFactory。而ConfORM就是利用Domain定義實(shí)現(xiàn)自動(dòng)生成HbmMapping類,完全避免了編寫(xiě)XML文件和反序列化。這樣的話,ConfORM正是起到了ORAWM“object to relational adapter without mappings"的作用。

  你可以到http://code.google.com/p/codeconform/ 獲取ConfORM

  ConfORM初試

  這是這個(gè)系列的第一篇,我們用一個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)一下吧,以后慢慢介紹其細(xì)節(jié)。首先我們寫(xiě)下NHibernate基礎(chǔ)代碼和通用代碼,這一步的代碼在將來(lái)的文章中也經(jīng)常使用,以后就不單獨(dú)貼出來(lái)了。

//Code Snippets Copyright http://lyj.cnblogs.com/
public static class NhConfig
{
private const string ConnectionString =
@"Data Source=./SQLEXPRESS;Initial Catalog=NHTest;Integrated Security=True;Pooling=False";
public static Configuration ConfigureNHibernate()
{
var configure = new Configuration();
configure.SessionFactoryName("Demo");
configure.Proxy(p => p.ProxyFactoryFactory<ProxyFactoryFactory>());
configure.DataBaseIntegration(db =>
{
db.Dialect<MsSql2008Dialect>();
db.Driver<SqlClientDriver>();
db.ConnectionString = ConnectionString;
db.LogSqlInConsole = true;//用于顯示輸出SQL
});
return configure;
}

public static string Serialize(HbmMapping hbmElement)
{
var setting = new XmlWriterSettings { Indent = true };
var serializer = new XmlSerializer(typeof(HbmMapping));
using (var memStream = new MemoryStream(2048))
using (var xmlWriter = XmlWriter.Create(memStream, setting))
{
serializer.Serialize(xmlWriter, hbmElement);
memStream.Flush();
memStream.Position = 0;
var sr = new StreamReader(memStream);
return sr.ReadToEnd();
}
}
}

  ConfigureNHibernate()方法用于配置NHibernate,Serialize方法用于輸出。我們開(kāi)始ConfORM之旅吧:

  1.定義一Domain

  開(kāi)始之旅,我們總是從最簡(jiǎn)單的入手,將來(lái)慢慢學(xué)習(xí)ConfORM到底如何"自動(dòng)"為我們復(fù)雜的Domain結(jié)構(gòu)生成出Mapping的。

//Code Snippets Copyright http://lyj.cnblogs.com/
public class Domain
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}

  2.ConfORM配置

  這一步非常重要,是ConfORM的核心所在,實(shí)例化一個(gè)ObjectRelationalMapper對(duì)象,裝配Domain對(duì)象,實(shí)例化Mapper對(duì)象,調(diào)用Mapper對(duì)象的CompileMappingFor()方法自動(dòng)生成HbmMapping。

//Code Snippets Copyright http://lyj.cnblogs.com/
public static HbmMapping GetMapping()
{
var orm = new ObjectRelationalMapper();
orm.TablePerClass<Domain>();
var mapper = new Mapper(orm);
return mapper.CompileMappingFor(new[] { typeof(Domain) });
}

  3.ConfORM之旅

  這一步關(guān)鍵環(huán)節(jié)是調(diào)用Configuration對(duì)象的AddDeserializedMapping()方法添加HbmMapping和配置元數(shù)據(jù)。

//Code Snippets Copyright http://lyj.cnblogs.com/
public static void JustForConfOrm()
{
//配置NHibernate
var conf = NhConfig.ConfigureNHibernate();
//在Configuration中添加HbmMapping
conf.AddDeserializedMapping(GetMapping(), "Domain");
//配置元數(shù)據(jù)
SchemaMetadataUpdater.QuoteTableAndColumns(conf);
//創(chuàng)建數(shù)據(jù)庫(kù)架構(gòu)
new SchemaExport(conf).Create(false, true);
//建立SessionFactory
var factory = conf.BuildSessionFactory();
//打開(kāi)Session做持久化數(shù)據(jù)
using (var s = factory.OpenSession())
{
using (var tx = s.BeginTransaction())
{
var domain = new Domain {Name = "我的測(cè)試"};
s.Save(domain);
tx.Commit();
}
}
//打開(kāi)Session做刪除數(shù)據(jù)
using (var s = factory.OpenSession())
{
using (var tx = s.BeginTransaction())
{
s.CreateQuery("delete from Domain").ExecuteUpdate();
tx.Commit();
}
}
//刪除數(shù)據(jù)庫(kù)架構(gòu)
new SchemaExport(conf).Drop(false, true);
}

  4.輸出XML

  好了,做了上面3步就完成了我們的測(cè)試:NHibernate自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)架構(gòu)、持久化數(shù)據(jù)、刪除數(shù)據(jù)、最后把數(shù)據(jù)庫(kù)架構(gòu)刪除。這時(shí)大家都有一個(gè)疑問(wèn),ConfORM自動(dòng)生成的HbmMapping是什么啊?序列化HbmMapping對(duì)象到底輸出什么?為了滿足大家的需求我們寫(xiě)段代碼讓ConfORM打印出XML,對(duì)照我們以往手寫(xiě)的*.hbm.xml文件看看是否符合:

//Code Snippets Copyright http://lyj.cnblogs.com/
public static void ShowXmlMapping()
{
var document = NhConfig.Serialize(GetMapping());
File.WriteAllText("MyMapping.hbm.xml", document);
Console.Write(document);
}

  這時(shí),我們打開(kāi)輸出目錄的MyMapping.hbm.xml文件看看內(nèi)容:

//Code Snippets Copyright http://lyj.cnblogs.com/
<?xml version="1.0" encoding="utf-8"?>
<
hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
namespace="YJingLee.ConfOrm" assembly="YJingLee.ConfOrm"
xmlns="urn:nhibernate-mapping-2.2">
<
class name="Domain">
<
id name="Id" type="Int32">
<
generator class="hilo" />
</
id>
<
property name="Name" />
</
class>
</
hibernate-mapping>

  恩,是手寫(xiě)的完全一樣,ConfORM可以意識(shí)到Domain類的成員,Id為主鍵使用了hilo生成策略,Name為屬性。咦,難道只會(huì)這樣生成?答案當(dāng)然不是,ConfORM提供了很多模式和定制化,這方面在以后一一介紹。

  僅僅使用了第二步的那幾行代碼就完成了自動(dòng)映射的功能,是不是很酷,看過(guò)這篇文章后,你是不是非常急切的想跟著我學(xué)習(xí)下ConfORM,然后試著重構(gòu)自己的老程序,拋掉hibernate.cfg.xml和*.hbm.xml文件了啊。

  結(jié)語(yǔ)

  這篇文章先帶著大家走進(jìn)ConfORM,其細(xì)節(jié)接下來(lái)慢慢介紹,大家有什么問(wèn)題和思考可以回復(fù)。附上源碼下載:YJingLee.TryConfOrm.zip (VS2010項(xiàng)目)

  參考資料

  Fabio Maulo:ConfORM: NHibernate un-Mapping

NET技術(shù)NHibernate3剖析:Mapping篇之ConfORM實(shí)戰(zhàn)(1):概覽,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久频这里精品99香蕉久网址 | 中文日产无乱码AV在线观 | 亚洲激情网站 | 日韩欧美精品有码在线播放 | 精品亚洲一区二区三区在线播放 | 欧美顶级情欲片免费看 | 把极品白丝班长啪到腿软 | 色婷婷综合久久久中文字幕 | 用快播看av的网站 | 在线观看国产亚洲 | 99久久国产露脸国语对白 | 国产乱对白精彩在线播放 | 久久99视频免费 | 免费无遮挡又黄又爽网站 | 熟女人妻AV五十路六十路 | 好男人在线观看免费视频WWW | 亚洲欧美日本中文子不卡 | 国产午夜精品视频在线播放 | 全黄H全肉细节文短篇 | 精品丰满人妻无套内射 | 日日久久狠狠8888偷偷色 | 日本伦子欲 | 亚洲一区免费看 | yellow日本动漫免费观看 | 欧美精品AV一区二区无码 | 黄色片软件大全 | 国产成人综合高清在线观看 | 麻豆国产自制在线观看 | 奇米精品一区二区三区在线观看 | 啊好大好厉害好爽真骚 | 久久精品电影久久电影大全 | 国产精品久久久久影院色 | 草草色| 亚洲视频在线观 | 久久无码人妻中文国产 | 国产精品亚洲精品久久国语 | 快播av种子 | 亚洲日韩在线观看 | 国产精品资源在线观看网站 | 欧美一区二区VA毛片视频 | 麻豆久久国产亚洲精品超碰热 |