2012-06-05 48 views
0

我有以下實體:項目,ProjectMapping和用戶,這是許多人manyHere是映射:NHibernate的許多一對多,無法刪除行

public ProjectMembershipMapping() 
{ 
    Property(pm => pm.IsAccepted, prop => prop.NotNullable(true)); 
    Property(pm => pm.Permission, prop => prop.NotNullable(true)); 
    ManyToOne(pm => pm.Member, mapping => 
            { 
             mapping.Lazy(LazyRelation.NoLazy); 
             mapping.Cascade(Cascade.All); 
            }); 
    ManyToOne(pm => pm.Project, mapping => 
            { 
             mapping.Lazy(LazyRelation.NoLazy); 
             mapping.Cascade(Cascade.All); 
            }); 

    ComposedId(pm =>           
        { 
         pm.ManyToOne(prop => prop.Member); 
         pm.ManyToOne(prop => prop.Project); 
        }); 
} 

public ProjectMapping() 
{ 
    Set(proj => proj.Members, 
      mapping => 
      { 
       mapping.Lazy(CollectionLazy.NoLazy); 
       mapping.Inverse(false); 
       mapping.Cascade(Cascade.All); 
       mapping.Table("ProjectMembership"); 
       mapping.Key(k => k.Column("Project")); 
      }, 
      action => action.OneToMany() 
     );  
} 

public class DevcoopUserMapping : ClassMapping<DevcoopUser> 
{ 
     Bag(user => user.ProjectMemberships, 
      mapping => 
       { 
        mapping.Lazy(CollectionLazy.NoLazy); 
        mapping.Inverse(false); 
        mapping.Cascade(Cascade.All); 
        mapping.Table("ProjectMembership"); 
        mapping.Key(k => k.Column("Member")); 
       }, 
      action => action.OneToMany()); 
} 

用戶可以有很多的成員項目。現在讓我們說我會退訂他的項目。通過的Isession對象只需刪除ProjectMembership對象拋出我:

deleted object would be re-saved by cascade (remove deleted object from associations)[devcoop.Daos.ProjectMembership#devcoop.Daos.ProjectMembership] 

在另一方面,當我第一次嘗試從項目和用戶刪除此ProjectMembership實例(我從協會刪除它建議給我),我得到例外:

could not delete collection: [devcoop.Daos.Project.Members#1][SQL: UPDATE ProjectMembership SET Project = null WHERE Project = @p0] 

任何人都可以幫忙嗎?據說我搞砸了映射周圍的東西,但我不知道這是什麼。

+0

我只設法通過在3個事務中使用hql查詢來刪除項目工作,這是一個混亂的解決方法,而不是一個解決方案。有沒有關於NHibernate的多對多的任何「最佳實踐」,因爲我明確地解決了這些映射的問題,但我找不到什麼 – soliloquyy

回答

0

在刪除ProjectMembership實例之前,將其從DevcoopUser.ProjectMemberships-和Project.Members-集合中刪除。

我認爲這應該工作:

membership.Member.ProjectMemberships.Remove(membership); 
    membership.Project.Members.remove(membership); 
    session.Delete(membership); 

,我想你應該從ProjectMembership映射刪除CascadeAll。我不完全確定,但我認爲它會將刪除級聯到與CascadeAll映射的集合中的所有成員和項目,您可能不希望發生這種情況。

+0

這些映射的問題現在我得到它導致異常: 無法刪除集合:[devcoop.Daos.Project.Members#1] [SQL:UPDATE ProjectMembership SET Project = null WHERE Project = @ p0] 正如我在問題中寫的。 – soliloquyy

+0

您是否可以在嘗試刪除ProjectMembership實例之前保存用戶和項目實體?如果是這樣,請在保存用戶和項目之前嘗試刪除ProjectMembership。我不明白爲什麼NH試圖更新ProjectMembership表。 –