天天看點

NHibernate初探(五) 多對多關系測試示例

三個資料表

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>

轉載請注明:部落格園