摘要
前面文章介绍了NHibernate对简单.net数据类型的映射对照表。NHibernate也可以映射复杂数据类型,这里介绍通过组件映射NHibernate值对象。
1. NHibernate引用对象和NHibernate值对象
- NHibernate引用对象:指的是具有主键值的NHibernate实体对象,他必须是另一个NHibernate实体对象的属性。他所属的对象也可以理解为主对象,有一个从属的指向关系。例如:Order对象有个属性Customer,表示这个Order对象是属于哪个Customer的。
- NHibernate值对象:指的是一般的.net对象,他没有主键,不具有唯一性,他可以是属于一个NHibernate实体对象的属性,也可以不“挂靠”在任何NHibernate实体对象上。例如:有个Address类街道地址、邮政编码、国家、省份、城市信息,Customer对象有个名称为Address的Address类属性对象,这个Address属性对象就是NHibernate值对象。
NHibernate引用对象由NHibernate引用映射定义,在后面文章介绍。本节介绍如何映射NHibernate值对象。
2. 程序演示
添加Address类
1 public class Address 2 { 3 public virtual string Street { get; set; } 4 public virtual string City { get; set; } 5 public virtual string Province { get; set; } 6 public virtual string Country { get; set; } 7 }
修改Customer类,将string类型的Street、City、Province、Country属性改成了Address类的Address属性。
1 public class Customer 2 { 3 public virtual Guid Id { get; set; } 4 public virtual string FirstName { get; set; } 5 public virtual string LastName { get; set; } 6 public virtual double AverageRating { get; set; } 7 public virtual int Points { get; set; } 8 public virtual bool HasGoldStatus { get; set; } 9 public virtual DateTime MemberSince { get; set; } 10 public virtual CustomerCreditRating CreditRating { get; set; } 11 public virtual Address Address { get; set; } 12 }
修改Customer.hbm.xml文件,添加component节点,设置节点的name属性为“Address”,里面包含Address的属性。
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemoApp" namespace="NHibernateDemoApp"> <class name="Customer" table="Customer"> <id name="Id"> <generator class="guid.comb"/> </id> <property name="FirstName" not-null="true"/> <property name="LastName" not-null ="true"/> <property name="AverageRating"/> <property name="Points"/> <property name="HasGoldStatus"/> <property name="MemberSince"/> <property name="CreditRating" type="CustomerCreditRating"/> <component name="Address"> <property name="Street"/> <property name="City"/> <property name="Province"/> <property name="Country"/> </component> </class> </hibernate-mapping>
修改CreateCustomer方法
1 private static Customer CreateCustomer() 2 { 3 var customer = new Customer 4 { 5 FirstName = "Daniel", 6 LastName = "Tang", 7 Points = 100, 8 HasGoldStatus = true, 9 MemberSince = new DateTime(2012, 1, 1), 10 CreditRating = CustomerCreditRating.Good, 11 AverageRating = 42.42424242, 12 Address = new Address 13 { 14 Street = "123 Somewhere Avenue", 15 City = "Nowhere", 16 Province = "Alberta", 17 Country = "Canada" 18 } 19 }; 20 21 return customer; 22 }
修改Main函数
1 static void Main(string[] args) 2 { 3 HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); 4 5 using (var session = SessionFactory.OpenSession()) 6 { 7 var customer = CreateCustomer(); 8 object custoemrId = session.Save(customer); 9 session.Flush(); 10 } 11 12 Console.WriteLine("Completed"); 13 Console.ReadLine(); 14 }
执行程序,再看数据库里插入的记录的包含了生成Customer对象时设置的Address信息。
作者:丹尼大叔
出处:http://www.cnblogs.com/uncle_danny
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。