Соотношение «многие ко многим»: как решить, куда поместить обратное = true с помощью XML Mapping - PullRequest
2 голосов
/ 17 марта 2012

Я читал об обратном = true в отношении один-ко-многим и на самом деле задавался вопросом, где установить это свойство в 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>

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

Ровно одна сторона отношений должна не быть помечена 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 - просто убедитесь, что одна сторона имеет, а другая нет.

3 голосов
/ 17 марта 2012

Вы должны установить сторону, которую вы не используете для обновления, как inverse.

В вашем случае вы, вероятно, добавляете награды пользователю, а не пользователям премии. Следовательно, Award.UserAwards будет inverse

Конечно, если вы делаете , вместо этого добавляете пользователей к награде, просто отмените то, что я только что сказал.

...