2013-05-29 2 views
0

나는 다음 클래스 tructure이에게 있습니다 유창함 NHibernate에있는 다 대다 관계.매핑 관계의 한 구성 요소

public class SearchTarget : IEntity { 
    public virtual String Name { get; set; } 
} 

public partial class PoliceAssistance { 
    public virtual Search SearchWithWarrant { get; set; } 
    public virtual Search SearchWithoutWarrant { get; set; } 

    public class Search : IEntityComponent { 
     public virtual IList<SearchTarget> Targets { get; set; } 
    } 
} 

IEntityComponentPoliceAssistance.Search 해당된다 SearchWithWarrantSearchWithoutWarrantPoliceAssistance가 동일한 테이블에 저장 유창함 NHibernate에의 자동 매핑의 구성 요소로 취급되는 것을 보장한다.

문제

PoliceAssistance.Search.TargetsSearchTarget 있어야 대다 관계 - 하나 개의 검색 많은 목표를 포함 할 수 있으며, 하나 개의 목표는 많은 검색에 표시 할 수 있습니다. 모두 SearchWithWarrantSearchWithoutWarrant 인스턴스화하는 경우에도하고 목록에서 하나 이상의 Target이 - 나는 PoliceAssistance.Search에 단방향 .HasManyToMany() 매핑을 지정하는 경우

, 나는 내가 엔티티를 저장하려고 할 때 "null 값이 null 이외의 제약 조건을 위반"GET . 내가 SearchTargetpublic virtual IList<PoliceAssistance.Search> InSearches { get; set; } 속성을 도입하고 .HasManyToMany().Inverse()로 매핑하여, 양방향 매핑을 지정하려고하면

, 나는이 매핑되지 않기 때문에 PoliceAssistance.Search가 참조 할 수 없다는 매핑 오류 (구성 요소가 때로 믿을 나는 매핑 유형을 추측 ' t는 매핑 된 것으로 간주?).

는이 문제를 어떻게 해결해야합니까?

답변

0

을, 나는 PoliceAssistance.Search로 작업 매핑을 얻으려고 노력을 포기 대신에 별도의 엔티티로 바꿨습니다. 최소한의 변경이 필요하며 예상대로 작동합니다.

// Classes 
public class SearchTarget : IEntity { 
    public virtual String Name { get; set; } 
} 

public partial class PoliceAssistance { 
    public virtual Search SearchWithWarrant { get; set; } 
    public virtual Search SearchWithoutWarrant { get; set; } 

    public class Search : IEntity { 
     public virtual int Id { get; set; } 
     public virtual IList<SearchTarget> Targets { get; set; } 
    } 
} 

// Mapping 
public class PoliceAssistanceMap : IAutoMappingOverride<PoliceAssistance> { 
    public void Override(AutoMapping<PoliceAssistance> map) { 
     map.References(x => x.SearchWithWarrant) 
      .Cascade.All(); 
     map.References(x => x.SearchWithoutWarrant) 
      .Cascade.All(); 
    } 
} 

public class SearchMap : IAutoMappingOverride<PoliceAssistance.Search> { 
    public void Override(AutoMapping<PoliceAssistance.Search> mapping) { 
     mapping.HasManyToMany(x => x.Targets); 
    } 
} 
0

나는 유창함 NHibernate에 엔진 만에 대해 아무것도 몰라 다 대다 연결이 항상 링크 테이블/객체로 이루어진다. 그래서 난 당신이 이런 식으로 뭔가있을 것이라고 기대 : 좀 더이 싸우는 후이 도움이

public class SearchTarget : IEntity 
{ 
    public virtual String Name { get; set; } 
    public virtual IList<Search_SearchTarget_Link> Searches { get; set; } 
} 

public class Search : IEntityComponent 
{ 
    public virtual IList<Search_SearchTarget_Link> Targets { get; set; } 
} 

public class Search_SearchTarget_Link : IEntity 
{ 
    public virtual Search search { get; set; } 
    public virtual SearchTarget searchtarget { get; set; } 
} 

public partial class PoliceAssistance 
{ 
    public virtual Search SearchWithWarrant { get; set; } 
    public virtual Search SearchWithoutWarrant { get; set; } 
} 

희망 ...

+0

Nhibernate가 대신이 작업을 수행합니다. 릴레이션을 정의하고 필요한 경우 모든 테이블이 자동으로 만들어지고 연결됩니다. –

+0

그래, 난 이미 그런 일을 할 것이라는 점을 이해하지만, 내가 말하고 모두가 다 대다 관계가 1 개 연결 실체와이 개 기관 toghether 연결에 의해 수행된다는 점이다. 지금 생각한 일은 프레임 워크가 데이터베이스 모델로 변환 할 수 없다는 것입니다. 왜냐하면 유효한 다 대 다 관계가 아니기 때문입니다.이 트릭은 코드에서만 작동합니다. 나는 당신의 지점을 오해하지 않는 한 – ikwillem

+0

은 즉, 다시, NHibernate에이 바로 이러한 작업을 수행하는 것 - 그것은 링크 테이블을 생성하고 코드 측에 번역을 관리합니다. 나는 그것을 이전에 해왔고, 여러 다른 시나리오 (두 개가 아닌 하나의 속성을 제외하고는 거의 똑같은 시나리오조차도)에서 작동했습니다. 그러나 "적절한"해결책을 찾지 못하면 당신의 대답이 의미가 있습니다. –

관련 문제