• 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。

  • 相关阅读:
    [Leetcode Weekly Contest]258
    [Leetcode Weekly Contest]256
    for in 和for of的区别
    JS常用库收集汇总
    vue项目中的.env环境变量配置文件
    Rust程序设计语言(5)
    《YOLOV4&5原理与源代码解析之五:SPP CSP》
    ping不同网段的脚本
    远程清空主机所有项目的日志脚本
    启动服务的脚本
  • 原文地址:https://www.cnblogs.com/nianming/p/2249917.html
Copyright © 2020-2023  润新知