2012-03-16 49 views
2

我在閱讀關於一對多關係中的inverse = true,並且實際上想知道在多個關係中將該屬性設置爲true的位置一對多的關係。 我知道逆是指出哪個實體/表是關係的所有者。在一對多的觀點中,這其實很簡單。購買你如何在多對多的關係中指出一方?還是沒有必要?多對多的關係:如何決定將XML映射到哪裏inverse = true

你能指出雙方嗎?或者你必須選擇一方?你如何確定哪一方是? 如果我認爲根據關係的所有者,我認爲這兩個集合必須設置inverse = true,因爲它們都不是關係的所有者。但實際上另一個也不是所有者。它是所有者的表UsersTargets。 有人能夠讓我離開我的婚姻嗎?

例如:用戶可以有很多獎項。 注意:沒有必要知道有多少用戶有特定的獎勵。所以也許我應該讓我的模型不同?反正我的代碼至今:

域:

public class User : Entity 
{ 
    ... 
    public virtual ISet<Award> Awards { get; set; } 
} 

public class Award : Entity 
{ 
    ... 
    public virtual ISet<User> Users { get; set; } 
} 

映射:

<-User.hbm.xml-> 
<set name="Awards" table="UsersAwards" cascade="all"> 
    <key column="UserId"/> 
    <many-to-many class="Award" column="AwardId"/> 
</set> 

<-Award.hbm.xml-> 
<set name="Users" table="UsersAwards" cascade="all"> 
    <key column="AwardId"/> 
    <many-to-many class="User" column="UserId"/> 
</set> 

Thx提前。

回答

4

確切地說,一方的關係應該是而不是被標記爲inverse。這意味着如果您決定從模型中刪除Award.Users屬性,請確保Users.Awards未標記爲inverse

如果你留在你的模型兩個集合,並使用這樣的代碼添加/刪除協會...

public class User 
{ 
    public virtual void Add(Award award) 
    { 
     award.Users.Add(this); 
     Awards.Add(award); 
    } 

    public virtual void Remove(Award award) 
    { 
     Awards.Remove(award); 
     award.Users.Remove(this); 
    } 
} 

...那麼它並不真正的問題你把inverse哪一方 - 只要確保一方有它,另一方沒有。

+0

Thx爲這個偉大的答案。包含我想知道的一切。 – Gigi2m02 2012-03-17 17:25:50

3

您應該將您不用於更新的一面設置爲inverse

就您而言,您可能會向用戶添加獎勵,而不是獎勵用戶。因此,Award.UserAwardsinverse

當然,如果你用戶添加到獎,而不是,只是扭轉了我剛纔說的。

+0

謝謝。這對我有很大的幫助。 – Gigi2m02 2012-03-17 17:30:32