0

테이블을 추가 할 때 다 테이블과 참조를 가진 을 삭제하려고 할 때 다 대다 관계가있다. 에서 AB 오류 아래 표는 발생합니다Fluent NHibernate - 추가 테이블이 많을 경우 - null 값을 삽입 할 수 없다. 삭제 중에 예외가 발생한다.

$ 예외가 { ": [A.AB # 20] 컬렉션을 삭제할 수 없습니다 [SQL을 : UPDATE AB SET 원조 = 널 WHERE 원조 = @ P0]" } NHibernate.Exceptions.GenericADOException

열 'AId'에 NULL 값을 삽입 할 수 없습니다. 테이블 'AB'; 열 은 널을 허용하지 않습니다. UPDATE가 실패합니다. 그 진술서는 만료되었습니다.

내 데이터베이스 스키마 : enter image description here

내 클래스 :

public class A 
{ 
    public virtual int AId { get; protected set; } 

    public virtual IList<AB> AB { get; set; } 
} 

public class B 
{ 
    public virtual int BId { get; protected set; } 

    public virtual IList<AB> AB { get; set; } 
} 

public class AB 
{ 
    public virtual int ABId { get; protected set; } 

    public virtual A A { get; set; } 

    public virtual B B { get; set; } 

    public virtual int CustomProperty { get; set; } 
} 

내 매핑 :

public class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Table("A"); 

     SchemaAction.None(); 

     Id(x => x.AId) 
      .GeneratedBy.Identity(); 

     HasMany(x => x.AB) 
      .KeyColumn("AId") 
      .Cascade.All(); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
     Table("B"); 

     SchemaAction.None(); 

     Id(x => x.BId) 
      .GeneratedBy.Identity(); 

     HasMany(x => x.AB) 
      .KeyColumn("BId") 
      .Cascade.All(); 
    } 
} 

public class ABMap : ClassMap<AB> 
{ 
    public ABMap() 
    { 
     Table("AB"); 

     SchemaAction.None(); 

     Id(x => x.ABId) 
      .GeneratedBy.Identity(); 

     Map(x => x.CustomProperty) 
      .Not.Nullable(); 

     References(x => x.A) 
      .Column("AId"); 

     References(x => x.B) 
      .Column("BId") 
      .Cascade.None(); 
    } 
} 

코드 :

_session.BeginTransaction(); 

var a = _session.Get<A>(1); 

foreach (var ab in a.AB) { 
    _session.Delete(ab);     
} 

_session.Delete(a); 

transaction.Commit(); 

의 레코드를 삭제하고 싶습니다. AB 테이블에있는 테이블과 모든 관련 레코드를 삭제하고 싶습니다.

가장 간단한 해결책은 AB 테이블 널 (NULL)도움입찰을 확인하는 것입니다하지만 난 거기에 더 나은 솔루션이며이 매핑에서 해결 될 수 있다고 생각합니다.

답변

0

:) 사전에 감사이 시도 :

HasMany(x => x.AB) 
    .KeyColumn("BId") 
    .Cascade.All() 
    .Inverse(); 
+0

같은 문제를 :( – gabrieln