三個資料表
Order訂單表
---------------------------------------------------------
orderid orderdate customer
1 2009-11-09 16:54:41.013 1
2 2009-12-12 10:29:00.543 1
3 2009-12-12 10:29:01.373 1
-------------------------------------------------------
Product商品表
productid name cost
1 電視機 500
2 收音機 50
3 手機 90
11 手機 90
12 手機 90
13 手機 90
14 手機 90
OrderProduct訂單産品表
OrderId productid
1 2
其中OrderProduct表中有一條記錄,記錄了訂單号為1的訂單的産品為産品号為2的産品,即
訂單1是一台價值50元的收音機
(一)[Order] 訂單表持久(多對多中的第一多)
public class Order
{
public virtual int Unid { get; set; }
public virtual DateTime OrderDate { get; set; }
public virtual string Memo { get; set; }
public virtual Customer Customer { get; set; }
public virtual IList<Product> Products { get; set; }
}
其中Products屬性為新加的,為每一個訂單都有一個産品集,即一個訂單對應多個産品
(二)Product産品表持久(多對多中的第二多)
public class Product
public virtual string ProductName { get; set; }
public virtual int Cost { get; set; }
public virtual IList<Order> Orders { get; set; }
}
除了3個正常的持久屬性外,還有一個Orders屬性,表示每個産品都有一個訂單集,即一種(一個)商品對應多個訂單
(三)訂單映射
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class name="Domain.Entities.Order,Domain" table="[Order]" >
<id name="Unid" column="OrderId" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" />
<property name="Memo" column="Memo" type="String"/>
<!--多對一關系:Orders屬于一個Customer-->
<many-to-one name="Customer" column="Customer" not-null="true" class="Customer" foreign-key="FK_CustomerOrders"/>
<bag name="Products" generic="true" table="OrderProduct">
<key column="OrderId" foreign-key="FK_orderproduct_order"/>
<many-to-many column="ProductId"
class ="Domain.Entities.Product,Domain"
foreign-key="FK_orderproduct_product"/>
</bag>
</class>
</hibernate-mapping>
在原有檔案的基礎上添加了多對多關系映射,這裡說明一下:
·Order持久類中的IList<Product> Products屬性,為Ilist泛型集合,在nhibernate中與bag對應。
·bag的名稱為Products,即屬性Products
·外鍵,OrderId,這個是兩者關系表(OrderProduct)表中的OrderId,這個不是映射關系,而是資料庫字段,大小寫不敏感。
·外鍵名稱FK_orderproduct_order
·多對多映射,對應多個産品,類型為Product持久類型,外鍵FK_orderproduct_product為産品對兩者關系表的外鍵
(四)産品映射
<class name="Domain.Entities.Product,Domain" table="Product" >
<id name="Unid" column="productid" type="Int32" unsaved-value="0">
<property name="ProductName" column="[name]" type="String" not-null="true" />
<property name="Cost" column="Cost" type="Int32"/>
<bag name="Orders" generic="true" table="OrderProduct">
<key column="productid" foreign-key="FK_orderproduct_product"/>
<many-to-many column="OrderId"
class="Domain.Entities.Order,Domain"
foreign-key="FK_orderproduct_order"/>
</bag>
</class>
三個正常屬性除外,與訂單表同理的bag映射
·IList<Order> Orders
·bag的名稱為Orders,即屬性Orders
·外鍵,productid,這個是兩者關系表(OrderProduct)表中的productid,這個不是映射關系,而是資料庫字段,大小寫不敏感。
·外鍵名稱FK_orderproduct_product
·多對多映射,對應多個産品,類型為Product持久類型,外鍵FK_orderproduct_order為訂單對兩者關系表的外鍵
說明:多對多關系的實作由中間的一個一對一表來實作,是以這種關系帶有很好的對稱性。是以可以在對稱性上來了解這種微妙的關系。
未完
更多内容請參見:http://www.cnblogs.com/lyj/archive/2008/10/27/1320764.html
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園