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

NHibernate3剖析:Mapping篇之ConfORM實戰(3):OneToOne語義

  ConfORM概述

  在ConfORM實戰(1):概覽中,描述了ConfORM簡單使用。在ConfORM實戰(2):原理中介紹了ConfORM的基本實現原理。如果你不熟悉ConfORM請查看前幾篇文章,你也可以到http://code.google.com/p/codeconform/獲取ConfORM。

  在這之前,我們需要為HbmMapping寫AsString()擴展方法:用于輸出HbmMapping對象的Mapping,用于學習測試使用,具體代碼參考這里

  在Domain設計中,關聯關系有單向關聯和雙向關聯兩種,那么一對一我們可以分為單向一對一關聯(Unidirectional one-to-one)、雙向一對一主鍵關聯(Bidirectional one-to-one (primary key association))、雙向一對一外鍵關聯(Bidirectional one-to-one (foreign key association))三種情況。這篇使用ConfORM“映射”這些Domain實例吧。

  One-to-One語義

  我們使用ObjectRelationalMapper類中的ONEToOne方法定義兩個對象一對一關系。

  單向一對一關聯(Unidirectional one-to-one)

  1.Domain

  設計單向一對一關聯Domain實例,Person對象和Address對象,人有一個地址。

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}

public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public int CivicNumber { get; set; }
}

  2.ConfORM

  使用ConfORM來配置Domain,使之編譯生成我們需要的HbmMapping對象。(注意黑體)

[Test]
public void UnidirectionalONEToOneMappingDemo()
{
//show how work with one-to-one and how ConfORM understands OOP
var orm = new ObjectRelationalMapper();
var mapper = new Mapper(orm);
var entities = new[] { typeof(Person), typeof(Address) };
//use the definition of table-to-class strategy class by class
orm.TablePerClass(entities);
// Defining relations
orm.ONEToOne<Person, Address>();
// Show the mapping to the console
var mapping = mapper.CompileMappingFor(entities);
Console.Write(mapping.AsString());
}

  3.Mapping

  上面測試輸出HbmMapping的映射字符串,如果你使用ReSharper或者TestDriven.NET工具測試,你可以看見下面輸出:

UnidirectionalO<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>oOneMapping  4.原理

  對于單向一對一關聯,實際就是設置IManyToOneMapper,ConfORM會在IPatternsAppliersHolder的ManyToOne和ManyToOnePath集合中匹配對應模式適配器,即匹配UnidirectionalONEToOneUniqueCascadeApplier模式適配器,進行相應操作。

  UnidirectionalONEToOneUniqueCascadeApplier:應用IManyToOneMapper.Unique(true)和ManyToOneMapper.Cascade(applyCascade.HasValue?applyCascade.Value : Cascade.All)。

  雙向一對一主鍵關聯(Bidirectional one-to-one (primary key association))

  1.Domain

  設計雙向一對一關聯Domain實例,Person對象和Address對象,人有一個地址,地址有一個人。

public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}

public class Address
{
public int Id { get; set; }
public Person Person { get; set; }
public string Street { get; set; }
public int CivicNumber { get; set; }
}

  2.ConfORM

  使用ConfORM來配置Domain,使之編譯生成我們需要的HbmMapping對象。其實這個代碼和上面的一樣:

[Test]
public void BidirectionalONEToOneMappingDemo1()
{
//show how work with one-to-one and how ConfORM understands OOP
var orm = new ObjectRelationalMapper();
var mapper = new Mapper(orm);
var entities = new[] { typeof(Person), typeof(Address) };
//use the definition of table-to-class strategy class by class
orm.TablePerClass(entities);
// Defining relations
orm.ONEToOne<Person, Address>();
//or orm.ONEToOne<Address,Person>();
// Show the mapping to the console
var mapping = mapper.CompileMappingFor(entities);
Console.Write(mapping.AsString());
}

  3.Mapping

  測試生成字符串:

BidirectionalO<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>oOneMapping  4.原理

  對于雙向一對一關聯,實際就是設置IONEToOneMapper,ConfORM會在IPatternsAppliersHolder的ONEToOne和ONEToOnePath集合中匹配對應模式適配器,即匹配到以下三個模式適配器,進行相應操作。

  BidirectionalPrimaryKeyAssociationMasterONEToOneApplier:應用IONEToOneMapper.Cascade(Cascade.All)

  BidirectionalONEToOneAssociationPoidApplier:應用IIdMapper.Generator(Generators.Foreign(BidirectionalONEToOneOrNull(subject.ReflectedType)))

  BidirectionalPrimaryKeyAssociationSlaveONEToOneApplier:應用IONEToOneMapper.Constrained(true)

  雙向一對一外鍵關聯(Bidirectional one-to-one (foreign key association))

  Domain與雙向一對一主鍵關聯(Bidirectional one-to-one (primary key association))相同。

  2.ConfORM

  配置Domain,注意黑體:

[Test]
public void BidirectionalONEToOneMappingDemo2()
{
//show how work with one-to-one and how ConfORM understands OOP
var orm = new ObjectRelationalMapper();
var mapper = new Mapper(orm);
var entities = new[] { typeof(Person), typeof(Address) };
//use the definition of table-to-class strategy class by class
orm.TablePerClass(entities);
// Defining relations
orm.ManyToOne<Person, Address>();
orm.ONEToOne<Address, Person>();

// Show the mapping to the console
var mapping = mapper.CompileMappingFor(entities);
Console.Write(mapping.AsString());
}

  3.Mapping

  測試生成字符串:

BidirectionalO<a href=/itjie/NETjishu/ target=_blank class=infotextkey>NET</a>oOneMapping  4.原理

  類似的,匹配到以下模式適配器:

  BidirectionalForeignKeyAssociationManyToOneApplier:應用IManyToOneMapper.Unique(true)和IManyToOneMapper.Cascade(Cascade.All)

  BidirectionalForeignKeyAssociationONEToOneApplier:應用IONEToOneMapper.PropertyReference(GetPropertyOf(manyToOneSideType, oNEToOneSideType))

  BidirectionalPrimaryKeyAssociationMasterONEToOneApplier:應用IONEToOneMapper..Cascade(Cascade.All)

  結語

  這篇文章展示ConfORM的One-to-One語義應用,映射了三種One-to-One映射。

  參考資料

  Fabio Maulo:ConfORM:“Mapping” One-To-One

NET技術NHibernate3剖析:Mapping篇之ConfORM實戰(3):OneToOne語義,轉載需保留來源!

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

主站蜘蛛池模板: 免费精品美女久久久久久久久 | 伊人久久精品午夜 | 色呦呦导航 | ai换脸女明星被躁在线观看免费 | 在教室伦流澡到高潮H女攻视频 | 乳交高H糙汉宠文 | 亚洲青青草原 | 国产蜜臀AV在线一区视频 | xxx在线播放| 果冻传媒在线观看高清完整免费 | 亚洲乱码一区二区三区香蕉 | 羞羞一区二区三区四区片 | 一道精品视频一区二区 | 海角社区在线视频播放观看 | 国产97精品久久久天天A片 | 午夜福利免费0948视频 | 无人区日本电影在线观看高清 | AV色蜜桃一区二区三区 | 亚洲国产欧美国产综合在线 | 嫩草影院精品视频在线观看 | 野花影院手机在线观看 | 麻豆官网入口 | 护士日本xx厕所 | 暖暖视频免费观看高清完整版 | 久久99精品涩AV毛片观看 | 蜜芽无码亚洲资源网站 | 国产久久精品热99看 | 色婷婷五月综合中文字幕 | 护士的下面又湿又紧10P | www.三级 | 亚洲精品婷婷无码成人A片在线 | a视频免费看 | 校花在公车上被内射好舒服 | www亚洲欲色成人久久精品 | 免费成人高清在线视频 | 99热这里只有精品88 | 奶头好翘是不是想要了 | 在线免费视频国产 | 国产a级午夜毛片 | 欧美91精品久久久久网免费 | 95国产精品人妻无码久 |