NHibernate初学者指南(7):映射模型到数据库之方式三

XML映射

在VS中为NHibernate映射文件添加智能感知能力,需要添加.xsd文件。在项目中创建一个解决方案文件夹,名为Schema,添加两个XML schema定义文件:nhibernate-configuration.xsd和nhibernate-mapping.xsd到这个文件夹,如下图:

image

当为实体定义映射时,我们添加一个新的XML文件到项目中。这个文件的扩展名必须是.hbm.xml。作为文件名,建议使用映射的实体名,例如,当映射Product实体时文件名为Product.hbm.xml。如下图所示:

image

还要设置XML文件的BuildAction属性为Embedded Resource,如下图所示:

image

关于XML怎么配置的我就不写了,因为园子里有很多关于NHibernate配置的教程,这里只做一个例子。

实战时间—使用XML映射简单的模型

在这个例子中,我们创建一个非常简单的领域模型,并且使用XML映射它。然后让NHibernate基于这些映射文件生成SQL脚本。

1. 在VS中创建一个Console Application,名字为:XmlMappingSample。

2. 添加对NHibernate.dll的引用。

3. 在解决方案中新建一个解决方案文件夹Schema,并添加nhibernate-configuration.xsd和nhibernate-mapping.xsd两个文件。

4. 在项目中创建Domain文件夹,添加Customer, Order和LineItem类到该文件夹:

Customer类

namespace XmlMappingSample.Domain
{
    public class Customer
    {
        public virtual int Id { get; set; }
        public virtual string CustomerName { get; set; }
    }
}

LineItem类

namespace XmlMappingSample.Domain
{
    public class LineItem
    {
        public virtual int  Id { get; set; }
        public virtual int  Quantity { get; set; }
        public virtual decimal UnitPrice { get; set; }
        public virtual string ProductCode { get; set; }
    }
}

Order类

namespace XmlMappingSample.Domain
{
    public class Order
    {
        public virtual int Id { get; set; }
        public virtual DateTime OrderDate { get; set; }
        public virtual Customer Customer { get; set; }
        public virtual IList<LineItem> LineItems { get; set; }
    }
}

5. 在Domain文件夹中新建一个XML文件,名为:Customer.hbm.xml,要忘了该文件的BuildAction属性设置为Embedded Resource。其代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="XmlMappingSample"
                   namespace="XmlMappingSample.Domain">
  <class name="Customer">
    <id name="Id">
      <generator class="hilo"/>
    </id>
    <property name="CustomerName"/>
  </class>
</hibernate-mapping>

6. 同样的方式,创建LineItem.hbm.xml和Order.hbm.xml文件,代码分别如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="XmlMappingSample"
                   namespace="XmlMappingSample.Domain">
  <class name="LineItem">
    <id name="Id">
      <generator class="hilo"/>
    </id>
    <property name="Quantity"/>
    <property name="UnitPrice"/>
    <property name="ProductCode"/>
  </class>
</hibernate-mapping>

 

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="XmlMappingSample"
                    namespace="XmlMappingSample.Domain">
  <class name="Order">
    <id name="Id">
      <generator class="hilo"/>
    </id>
    <property name="OrderDate"/>
    <many-to-one name="Customer" column="CustomerId"/>
    <bag name="LineItems" inverse="true">
      <key column="OrderId"/>
      <one-to-many class="LineItem"/>
    </bag>
  </class>
</hibernate-mapping>

7. 在Program类中添加如下using语句。

using NHibernate.Cfg;
using NHibernate.Cfg.Loquacious;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Tool.hbm2ddl;
using XmlMappingSample.Domain;

8. 在Program类的Main方法中,创建NHibernate配置对象,如下面的代码所示:

var configuration = new Configuration();
configuration.DataBaseIntegration(db =>
{
    db.Dialect<MsSql2008Dialect>();
    db.Driver<SqlClientDriver>();
});

9. 将所有的XML映射文件添加到配置:

configuration.AddAssembly(typeof(Customer).Assembly);

10. 添加下面的代码,创建并在控制台上显示SQL脚本:

var exporter = new SchemaExport(configuration);
exporter.Execute(true, false, false);

11. 添加下面的代码避免程序不经确认就退出:

Console.Write("按回车退出:");
Console.ReadLine();

12. 运行程序,控制台输出如下:

xmlmapping

至此,三种映射模型的方式就讲完了,下一篇Sessions和Transactions。

posted @ 2011-11-15 16:47  BobTian  阅读(2549)  评论(0编辑  收藏  举报