一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

NHibernate3剖析:Mapping篇之ConfORM實戰(1):概覽

  ORuM思想浮出

  對于ORM(Object Relational Mapping)我們太熟悉了,但是我們從另一個角度可以想象出ORuM(Object Relational un-Mapping)的思想理念。我們在程序中僅僅定義Domain,而想有個工具可以幫助我們"自動化"實現Mapping,我們無需按傳統的ORM思想那樣為Domain手動編碼Mapping。

  ORuM對于使用者來說更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-Relational Intelligent-Mapping)的意思。

  有沒有這樣的實現呢?答案是相當肯定的。

  ConfORM概述

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

  那么ConfORM到底如何"自動"的呢?

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

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

  ConfORM初試

  這是這個系列的第一篇,我們用一個簡單的例子實現一下吧,以后慢慢介紹其細節。首先我們寫下NHibernate基礎代碼和通用代碼,這一步的代碼在將來的文章中也經常使用,以后就不單獨貼出來了。

//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方法用于輸出。我們開始ConfORM之旅吧:

  1.定義一Domain

  開始之旅,我們總是從最簡單的入手,將來慢慢學習ConfORM到底如何"自動"為我們復雜的Domain結構生成出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的核心所在,實例化一個ObjectRelationalMapper對象,裝配Domain對象,實例化Mapper對象,調用Mapper對象的CompileMappingFor()方法自動生成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之旅

  這一步關鍵環節是調用Configuration對象的AddDeserializedMapping()方法添加HbmMapping和配置元數據。

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

  4.輸出XML

  好了,做了上面3步就完成了我們的測試:NHibernate自動創建數據庫架構、持久化數據、刪除數據、最后把數據庫架構刪除。這時大家都有一個疑問,ConfORM自動生成的HbmMapping是什么啊?序列化HbmMapping對象到底輸出什么?為了滿足大家的需求我們寫段代碼讓ConfORM打印出XML,對照我們以往手寫的*.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);
}

  這時,我們打開輸出目錄的MyMapping.hbm.xml文件看看內容:

//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>

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

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

  結語

  這篇文章先帶著大家走進ConfORM,其細節接下來慢慢介紹,大家有什么問題和思考可以回復。附上源碼下載:YJingLee.TryConfOrm.zip (VS2010項目)

  參考資料

  Fabio Maulo:ConfORM: NHibernate un-Mapping

NET技術NHibernate3剖析:Mapping篇之ConfORM實戰(1):概覽,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 天天干天天色天天干 | 在线综合色| 午夜视频免费看 | 五月婷婷六月综合 | 美女一级ba大片免色野外 | 亚洲天堂国产精品 | 日本特黄色 | 国产精品欧美亚洲韩国日本 | 天天躁日日躁成人字幕aⅴ 天天躁日日躁狠狠躁中文字幕老牛 | 国产日韩欧美精品一区二区三区 | 韩国美女一区二区 | 高清成年美女黄网站色大 | 色呦呦影院 | 狠狠综合欧美综合欧美色 | 久久国产精品国产自线拍免费 | 激情小说图片区 | 午夜小视频网站 | 亚洲一区精品伊人久久伊人 | 免费激情小视频 | 激情综合丁香 | 五月婷婷激情视频 | 最大胆极品欧美人体 | 一区二区免费视频 | 精品国产高清不卡毛片 | 日韩成人免费一级毛片 | 欧洲a老妇女黄大片 | 久久免费福利视频 | 日韩精品中文字幕一区二区三区 | 加勒比在线免费视频 | 一区二区三区在线免费 | 天天色天天干天天 | 国产精品二区高清在线 | 成人免费草草视频 | 日本欧美一区二区三区不卡视频 | 国产精自产拍久久久久久蜜 | 91精品国产麻豆91久久久久久 | 香蕉人人超人人超免费看视频 | 免费超爽大片黄 | 97起碰 | 亚洲影院手机版777点击进入影院 | 久久成人免费观看全部免费 |