2012-02-05 30 views
0

我不得不实体:NHibernate的与瀑布很多,一对多的关系

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应该删除与此组提及的所有条目;

正是我需要重写我的映射?

回答

0

这是NH的标准行为,用于noniverse侧的双向关联。非反面(一个没有set.Inverse(true))可以保留对连接表的更改。为了从反侧删除对象,你需要编写额外的代码。

从许多-to-many关联的noniverse侧删除实体很容易,只需要调用执行Session.delete(实体)和NH将删除实体,然后从连接表中所有相关记录。若要从反侧的实体(一个具有逆映射(真)),你需要走另一条路

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中看到论坛上同样的问题的答案。

+0

>要从你需要编写额外的代码逆侧删除对象。 附加装置更上侧的用户映射? – 2012-02-06 08:01:01

+0

我更新了我的答案。 – hival 2012-02-06 10:07:50