2012-06-05 5 views
0

행 삭제할 수 없습니다 :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()); 
} 

사용자가 많은 구성원이 될 수 있습니다 : 프로젝트, ProjectMapping 및 사용자, 그것은 manyHere에 많은 사람들이 매핑이 있어요 프로젝트. 자, 내가 프로젝트에서 그를 탈퇴한다고 가정합시다. ISession 객체에 의해 바로 삭제 ProjectMembership 객체는 저를 던졌습니다 :

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

, 내가 먼저 (나에게 제안했다대로 나는 협회에서 삭제) 프로젝트 및 사용자에서이 ProjectMembership 인스턴스를 삭제하려고, I 예외 발생 :

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

아무도 도와 줄 수 있습니까? 기발한 일이지만 매핑 주위에 뭔가를 망쳐 놓았지만, 나는 이것이 무엇인지 모릅니다.

+0

3 건의 트랜잭션에서 hql 쿼리를 사용하여 프로젝트를 삭제할 수 밖에 없었습니다. 해결책이 아닌 지저분한 해결 방법입니다. 이 매핑 주위에 뭔가 명확하게 망쳐 놓았 기 때문에 NHibernate의 many-to-many에 대한 "best practice"가 있습니까? 정확히 무엇을 찾을 수 없는가? – 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 : UPMATE ProjectMembership SET Project = null WHERE Project = @ p0] . – soliloquyy

+0

ProjectMembership 인스턴스를 삭제하기 전에 사용자 및 프로젝트 엔티티를 저장하고 있습니까? 그렇다면 사용자와 프로젝트를 저장하기 전에 ProjectMembership을 삭제하십시오. NH가 ProjectMembership 테이블을 업데이트하려고하는 이유를 모르겠습니다. –