一起谈.NET技术,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 OOPvar 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 classorm.TablePerClass(entities);// Defining relationsorm.OneToOne<Person, Address>();// Show the mapping to the consolevar mapping = mapper.CompileMappingFor(entities);Console.Write(mapping.AsString());}

  3.Mapping

  上面测试输出HbmMapping的映射字符串,如果你使用ReSharper或者TestDriven.Net工具测试,你可以看见下面输出:

  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 OOPvar 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 classorm.TablePerClass(entities);// Defining relationsorm.OneToOne<Person, Address>();//or orm.OneToOne<Address,Person>();    // Show the mapping to the consolevar mapping = mapper.CompileMappingFor(entities);Console.Write(mapping.AsString());}

  3.Mapping

  测试生成字符串:

  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 OOPvar 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 classorm.TablePerClass(entities);// Defining relationsorm.ManyToOne<Person, Address>();    orm.OneToOne<Address, Person>();// Show the mapping to the consolevar mapping = mapper.CompileMappingFor(entities);Console.Write(mapping.AsString());}

  3.Mapping

  测试生成字符串:

  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

时间: 2024-11-10 12:04:52

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义的相关文章

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(4):ManyToMany语义

ConfORM概述 如果你不熟悉ConfORM请查看前几篇文章,你可以到http://code.google.com/p/codeconform/获取ConfORM最新版本. 在Domain设计中经常使用集合,在.Net中的集合有四种:Iesi.Collections.Generic.ISet<T>.System.Collections.Generic.ICollection<T>.System.Collections.Generic.IList<T>.System.C

NHibernate3剖析:Mapping篇之ConfORM实战(4):ManyToMany语义

ConfORM概述 如果你不熟悉ConfORM请查看前几篇文章,你可以到http://code.google.com/p/codeconform/获取ConfORM最新版本. 在Domain设计中经常使用集合,在.Net中的集合有四种:Iesi.Collections.Generic.ISet<T>.System.Collections.Generic.ICollection<T>.System.Collections.Generic.IList<T>.System.C

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(5):Component语义

Component语义 使用ConfORM"映射"组件,我们无需特别设置,ConfORM内部会根据Domain定义来判定组件,一般而言,没有主键的类就是组件. [Test]public void ComponentMappingDemo(){//show how work with components and how ConfORM understands OOPvar orm = new ObjectRelationalMapper();var mapper = new Mappe

NHibernate3剖析:Mapping篇之ConfORM实战(5):Component语义

Component语义 使用ConfORM"映射"组件,我们无需特别设置,ConfORM内部会根据Domain定义来判定组件,一般而言,没有主键的类就是组件. [Test] public void ComponentMappingDemo() { //show how work with components and how ConfORM understands OOP var orm = new ObjectRelationalMapper(); var mapper = new

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

ConfORM概述 在上一节中,我用一个简单的例子描述了ConfORM简单使用.留下了很多疑问,大家不解为何使用ConfORM以及怎么使用ConfORM,其内部原理是什么.这节,我们先注重了解一些ConfORM的原理. 你可以到http://code.google.com/p/codeconform/ 获取ConfORM ConfORM重要接口 ConfORM的核心就是实例化一个ObjectRelationalMapper对象和Mapper对象,配置Domain对象,调用Mapper对象的Com

一起谈.NET技术,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

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-

一起谈.NET技术,NHibernate 3.0.0.Alpha1 发布及新特性介绍

发布 刚刚NHibernate的Leader--Fabio Maulo发布了NHibernate 3.0.0.Alpha1版本,这是NHibernate 3.0.0的第一个公开测试版本. 下载地址 你可以到这里下载NHibernate 3.0.0.Alpha1,基于.Net3.5平台,具体文件如下. NHibernate源码:NHibernate-3.0.0.Alpha1-src.zip NHibernate二进制文件:NHibernate-3.0.0.Alpha1-bin.zip 特性介绍 N

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com