2012-05-19 50 views
0

嗨,我將如何建立這種關係?我alreade有一個多對多的realtionship,但現在我需要在連接表中添加一個額外的列的新功能。多對多連接表上的額外列

爲簡單起見,我有一個User類,產品類和UserProduct類,今天它看起來像這樣。

Product.hbm.xml

<bag name="Users" table="users_products" inverse="true" cascade="save-update" > 
    <cache usage="read-write" /> 
    <key column="ProductId" /> 
    <many-to-many class="User" column="UserId" outer-join="true" /> 
</bag> 
<bag name="UserProduct" inverse="true" cascade="save-update"> 
    <cache usage="read-write" /> 
    <key column="ProductId" /> 
    <one-to-many class="UserProduct" /> 
</bag> 

User.hbm.xml

<bag name="Products" table="users_products" inverse="true" cascade="save-update" > 
    <cache usage="read-write" /> 
    <key column="UserId" /> 
    <many-to-many class="Product" column="ProductId" /> 
</bag> 
<bag name="UserProduct" inverse="true" cascade="save-update"> 
    <cache usage="read-write" /> 
    <key column="UserId" /> 
    <one-to-many class="UserProduct" /> 
</bag> 

級聯應該怎麼樣子的呢? 現在的新功能,我創建了一個新的類UserProduct:

private int _id; 
private User _user; 
private Product _product; 
private string _ownComment; 

而創建 UserProduct.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="" assembly=""> 
    <class name="UserProduct" table="users_products"> 
    <cache usage="read-write"/> 
    <id name="Id" column="UsersWhiskiesId" type="Int32" length="4" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <many-to-one name="User" class="User" column="UserId" not-null="true" /> 
    <many-to-one name="Product" class="Product" column="ProductId" not-null="true" /> 

    <property name="OwnComment" column="OwnComment" type="String" /> 

    </class> 
</hibernate-mapping> 

如果我之前已經使用user.Products.Add(產品); 現在它會是什麼樣子? 我將如何映射用戶和產品? 我如何更新感興趣的記錄? 當我刪除用戶時,我想刪除與產品的關聯而不是產品。

新問題: 我有一個頁面,註冊用戶可以收集產品。在這個頁面上,我現在希望用戶能夠隱藏某些產品。我有一個gridview填充和一個複選框的templatefield。如何更新UserProduct,其中有一列「HideProduct」。我有一個按鈕中的代碼。

for (int i = 0; i < this.gvProducts.Rows.Count; i++) 
     { 
      GridViewRow row = this.gvProducts.Rows[i]; 
      bool isChecked = ((CheckBox)row.FindControl("chkSelect")).Checked; 

      if (isChecked) 
      { 
       int productId= 

Convert.ToInt32(this.gvProducts.DataKeys[row.RowIndex].Value); 
    UserProduct up= new UserProduct(); 
    up.User = this._user; 
       up.Product= DataManagement.CoreRepository.GetObjectById<Product>(productId); 
       up.HideProduct = isChecked; 
       DataManagement.CoreRepository.UpdateObject(up); 

感謝您的幫助!

回答

2

你需要在你的數據庫中的許多一對多的關係分成兩個多到一對一的關係,就像。

所以,一個用戶有很多UserProduct項目,一個產品有很多UserProduct項目。 UserProduct有一個用戶和一個產品。

+0

檢查我的新問題。我已經完成的映射。 – Thommie