NHibernate отношения «многие ко многим» с каскадами - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть лица:

public class User
{
    public virtual long Id { get; set; }
    public virtual long Name { get; set; }
}

public class Group
{
    public virtual long Id { get; set; }
    public virtual long Name { get; set; }
}

Отображается следующим образом:

public class UserMapping : ClassMapping<User>
{
    public UserMapping()
    {
        Table("User");
        Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef()));
        Property(e => e.Name, map => map.Length(50));
    }
}

public class GroupMapping : ClassMapping<Group>
{
    public GroupMapping()
    {
        Table("Group");
        Id(e => e.Id, t => t.Generator(new IdentityGeneratorDef()));
        Property(e => e.Name, map => map.Length(50));

        Set(x => x.Users, set =>
        {
            set.Table("UserToGroup");               
            set.Key(key => key.Column("GroupId");
        },
        re => re.ManyToMany(m => m.Column("UserId")));
    }
}

Когда я удаляю запись пользователя, из таблицы UserToGroup должны быть удалены все записи с указанным пользователем. Когда я удаляю запись группы, из таблицы UserToGroup должны быть удалены все записи с упомянутой группой;

Как именно мне нужно переписать мои сопоставления?

1 Ответ

0 голосов
/ 05 февраля 2012

Это стандартное поведение NH для стороны не вселенной двунаправленной ассоциации.Не обратная сторона (одна без set.Inverse (true)) ответственна за сохраняющиеся изменения в соединительной таблице.Чтобы удалить объект с обратной стороны, вам нужно написать дополнительный код.

Чтобы удалить объект со стороны, не связанной со вселенной, ассоциации «многие ко многим» очень просто, просто вызовите session.Delete (entity) и NH удалитсущность и все соответствующие записи из таблицы соединений.Чтобы удалить объект с обратной стороны (тот, который отображается с помощью Inverse (true)), вам нужно пойти другим путем

var user = ... // user do delete
// delete records from join table
foreach (var group in user.Groups)
{
    group.Users.Remove(user);
}
// delete entity
session.Delete(user);

Аналогичный код, который я видел на форумах Hibernate как ответ на тот же вопрос.

...