XML映射
在VS中为NHibernate映射文件添加智能感知能力,需要添加.xsd文件。在项目中创建一个解决方案文件夹,名为Schema,添加两个XML schema定义文件:nhibernate-configuration.xsd和nhibernate-mapping.xsd到这个文件夹,如下图:
当为实体定义映射时,我们添加一个新的XML文件到项目中。这个文件的扩展名必须是.hbm.xml。作为文件名,建议使用映射的实体名,例如,当映射Product实体时文件名为Product.hbm.xml。如下图所示:
还要设置XML文件的BuildAction属性为Embedded Resource,如下图所示:
关于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. 运行程序,控制台输出如下:
至此,三种映射模型的方式就讲完了,下一篇Sessions和Transactions。