NHibernate系列文章十五:NHibernate组件

2023-02-12,,,

摘要

前面文章介绍了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类

     public class Address
{
public virtual string Street { get; set; }
public virtual string City { get; set; }
public virtual string Province { get; set; }
public virtual string Country { get; set; }
}

修改Customer类,将string类型的Street、City、Province、Country属性改成了Address类的Address属性。

     public class Customer
{
public virtual Guid Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual double AverageRating { get; set; }
public virtual int Points { get; set; }
public virtual bool HasGoldStatus { get; set; }
public virtual DateTime MemberSince { get; set; }
public virtual CustomerCreditRating CreditRating { get; set; }
public virtual Address Address { get; set; }
}

修改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方法

         private static Customer CreateCustomer()
{
var customer = new Customer
{
FirstName = "Daniel",
LastName = "Tang",
Points = ,
HasGoldStatus = true,
MemberSince = new DateTime(, , ),
CreditRating = CustomerCreditRating.Good,
AverageRating = 42.42424242,
Address = new Address
{
Street = "123 Somewhere Avenue",
City = "Nowhere",
Province = "Alberta",
Country = "Canada"
}
}; return customer;
}

修改Main函数

         static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); using (var session = SessionFactory.OpenSession())
{
var customer = CreateCustomer();
object custoemrId = session.Save(customer);
session.Flush();
} Console.WriteLine("Completed");
Console.ReadLine();
}

执行程序,再看数据库里插入的记录的包含了生成Customer对象时设置的Address信息。

NHibernate系列文章十五:NHibernate组件的相关教程结束。

《NHibernate系列文章十五:NHibernate组件.doc》

下载本文的Word格式文档,以方便收藏与打印。