2012-02-05 67 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