丹尼大叔

数学专业毕业,爱上编程的大叔,兴趣广泛。使用博客园这个平台分享我工作和业余的学习内容,以编程交友。有朋自远方来,不亦乐乎。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

摘要

前面文章介绍了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信息。

posted on 2016-07-06 22:00  丹尼大叔  阅读(555)  评论(1编辑  收藏  举报