NHibernate与Cascades的多对多关系

时间:2012-02-05 16:53:56

标签: nhibernate nhibernate-mapping

我必须要实体:

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 :(得分:0)

这是双向关联的 noniverse 方面的NH的标准行为。非反面(没有set.Inverse(true))可用于持久更改连接表。要从反面删除对象,您需要编写其他代码。

要从多对多关联中删除实体很容易,只需调用session.Delete(实体)和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论坛中看到的类似代码是对同一问题的回答。