2014-07-04 4 views
1

자식 테이블에서 복합 매핑 여기 만 간다 :유창함 NHibernate에 - 그것은 아마도 유창함 수행 할 수 없습니다 이전 쿼리보고 - - 나는 확실히 누군가가 전에 이런 짓을했는지하는 생각

나는 다음과 같은 매핑을

자식 테이블의 키가 부모 테이블과 일치하지 않으므로이 키가 작동하지 않을 수 있으므로 외부 키 계약의 필드 수가 일치하지 않으므로 오류가 발생합니다. 그러나, 나는 기본 테이블을 변경할 수없고 관계도 유효합니다. 유창한 nhibernate에서이 문제를 해결할 수있는 방법이 있습니까? 두 복합 필드에서 예상되는 조인을 무시하고 일치하는 필드 (예 : field_one?)에서만 조인 할 수 있습니다. Hibernate는 필드 1과 필드 2가 두 매핑 모두에 존재할 것으로 예상합니다. ChildDataMap FieldOne 값이 항상 ParentMap FieldOne 및 FieldOne 나타나는 경우

public ParentMap() 
{ 
    Table("dbo.SOMEPARENT"); 
    OptimisticLock.None(); 
    LazyLoad(); 
    CompositeId() 
    .KeyReference(x => x.FieldOne, x => x.Access.CamelCaseField(Prefix.Underscore), "field_one") 
    .KeyReference(x => x.FieldTwo, x => x.Access.CamelCaseField(Prefix.Underscore), "field_two"); 

    HasMany(x => x.ChildData) 
      .Access.CamelCaseField(Prefix.Underscore) 
      .Cascade.AllDeleteOrphan() 
      .KeyColumns.Add("field_one") 
      .NotFound.Ignore(); 

}

public ChildDataMap() 
{ 
Table("dbo.SOMECHILD"); 
OptimisticLock.None(); 
LazyLoad(); 

CompositeId() 
    .KeyProperty(x => x.FieldOne, x => x.Access.CamelCaseField(Prefix.Underscore).ColumnName("field_one")) 
    .KeyProperty(x => x.FieldTwo, x => x.Access.CamelCaseField(Prefix.Underscore).ColumnName("field_two")) 
    .KeyProperty(x => x.FieldThree, x => x.Access.CamelCaseField(Prefix.Underscore).ColumnName("field_three")) 
    .KeyProperty(x => x.FieldFour, x => x.Access.CamelCaseField(Prefix.Underscore).ColumnName("field_four")); 
Map(x=>x.DontExecTrigger).Column("dont_exec_trigger").Access.CamelCaseField(Prefix.Underscore); 
Map(x=>x.DateField).Column("date_field").Access.CamelCaseField(Prefix.Underscore); 
Map(x=>x.DataField).Column("data_field").Access.CamelCaseField(Prefix.Underscore); 

References(x => x.Parent) 
    .Access.CamelCaseField(Prefix.Underscore) 
    .Cascade.All() 
    .Fetch.Select() 
    .Columns("field_one") 
    .NotFound.Ignore() 
    .Not.LazyLoad(); 

}보기의 순수 데이터베이스 관점에서

답변

1

, ParentMap에서 독특한 것은 다음 외래 키가 전자에서 후자에 이르기까지 또한 FieldOne이 (고유 한) ParentMap의 후보 키임을 의미합니다.

FK 및 UNIQUE 데이터베이스 제약 조건을 선언해야합니다. 테이블을 변경할 수는 없지만 제약 조건이 유효하다면 그 제약 조건에 영향을 미치지 않습니다. 그걸 선언해야합니다 ChildDataMap FirstOne References ParentMap FirstOne. 2 열 집합은 여전히 ​​PK라고 선언 할 수 있습니다 (가정). 그러나 ParentMap FieldTwo도 고유하면 UNIQUE로 선언되어야하며 따라서 하나의 열 FK 타겟으로 사용할 수있게됩니다.

아마도 UNIQUE 제약 조건 및/또는 FK가 이미 선언되어있을 수 있습니다. 어쩌면 ParentMap의 FirstOne에 해당하는 고유 속성을 선언해야합니다. KeyColumns.Add는 거기에 의존해야하며 ChildDataMap에서 References를 선언 할 수 있어야합니다. 그러나 그것이 당신의 코드가 유효하지 않은 곳이라고 생각합니다.

Hibernate가 같은 이름의 필드에 자동으로 참여하지 않으면 References를 선언하고 하나의 필드에 자신 만의 조인을하여 하나의 요소 만있는 참조 집합을 가져올 수 있습니다.

"테이블을 변경할 수 없다"(유효한 제약 조건을 추가 할 수 없습니까?) 또는 "관계가 유효합니까?"(즉, FieldOne 부모는 고유 한가?). 또한 관련 코드를 모두 게시 한 경우 도움이됩니다. 즉 제약 조건을 포함하는 테이블 삭제.

새 테이블을 정의 할 수있는 경우 추가 된 제약 조건이있는 StricterParentMap을 추가하고 ParentMap을 뷰로 선언 할 수 있습니다. 이것은 다른 사람의 사용에 영향을 미치지 않으며 "변경할 수 없다"고 간주하지 않을 수도 있습니다.

+0

너무 늦었 어! 어떤 기술을 사용할 수 있었습니까? – philipxy

+0

안녕하세요. 나는 데이타베이스의 표현을 제공하는 뷰를 쓰도록 DB를 얻었습니다. NHibernate가 이런 종류의 시나리오를 허용하지 않는다는 결론에 도달해야합니다. 기본 데이터베이스는 관계가 매우 느슨하므로보기가 가장 깨끗한 옵션처럼 보입니다. 회신을위한 건배, 그러나 .. –