0

나는 내 응용 프로그램에 대한2 cols로 클래스를 참조하는 방법 2 cols로 구성된 클래스의 CompositeId FluentNhibernate의 CompositeId?

public class BaseMap<T> : ClassMap<T> 

을 만들려고 해요. 내가 원하는

CompositeId() 
    .KeyProperty(x => x.Id) 
    .KeyProperty(x => ((ILocalizedEntity)x).Language); 

또 다른 것은 하나 개의 지역화 된 클래스가 다른 지역화 된 클래스를 참조 할 수 있습니다 : 그것은 그들의 기본 키가 모두 아이디 & 언어해야 지역화 된 엔티티를 지원해야한다. 내가했던

은 다음 (많은 연구 후에, 이것은 내가 가진 모든 임) : 이것은 나에게 삽입을 시도 IndexOutOfRange 예외를 준

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Columns("Language"); 
     } 

     return base.References(memberExpression); 
    } 

, 이유였습니다 "언어"속성 두 번 매핑하지만, DB 만 1 언어 열이 있었다, 그래서 나는이 한되었다

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert(); 
     } 

     return base.References(memberExpression); 
    } 

IndexOutOfRange 문제를 해결하지만, 내가 원하는 것을 성취하지 않았다 어느. 그것은 Not.Insert()와 Not.Update()를 지정했기 때문에 항상 "CategoryId"컬럼에 NULL을 삽입하기 때문에 그렇지 않습니다!

이제 "CategoryId"가 매핑되었지만 "언어"가 매핑되지 않기를 바란다. 이미 매핑 되었기 때문에 CompositeId (기본 키)의 일부이기 때문이다. 그러나 중 하나가 행운 - 그것은 단지 "언어"가 아닌 "카테고리 ID"를 삽입하거나 업데이트하지 않습니다 Whishing

public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity 
    { 
     if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther))) 
     { 
      return base.References(memberExpression) 
       .Columns("CategoryId") 
       .Nullable() 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert(); 
     } 

     return base.References(memberExpression); 
    } 

:

그래서 나는이에 시도했다.

는 또한 먼저 PK에서 언어를 만들려고했습니다

  CompositeId() 
       .KeyProperty(x => ((ILocalizedEntity)x).Language) 
       .KeyProperty(x => x.Id); 

그리고에 대한 참조를 변경 :

  return base.References(memberExpression) 
       .Columns("Language") 
       .Not.Update() 
       .Not.Insert() 
       .Columns("CategoryId") 
       .Nullable(); 

그러나 여전히 "Not.Insert()"와 "하지 않음 .Update() "가"언어 "&"CategoryId "에 모두 영향을줍니다.

I는 다음과 같이 "참조"호출하기 전에 "카테고리 ID를"매핑 시도 :

  Map(memberExpression, "Language"); 
      return base.References(memberExpression) 
      ....... 

그러나 실패했습니다.

누구나 2 열이있는 클래스에서 2 열의 CompositeId를 참조하는 방법이 있습니다. 하나의 열이 기본 키와 외래 키에 공통적 인 경우 CompositeId?

+0

가능한 한 compositeIds를 피하십시오.다음은 또한 중복을 피할 수 있습니다. http://stackoverflow.com/a/5431842/671619 – Firo

+0

그래도 사용하고 싶다면 왜 그렇게 복잡해야합니까? 구조적으로 프로그램과 DB에서 무엇이 옳은지 생각해 보면 복합 ID가 때로는 최상의 선택입니다 ... 그렇지 않습니까? –

답변

0

나는 compositeid의 일부로 비슷한 문제가 있었고 Google과 함께 해결할 수도 없었고 2 주 동안 나 자신도 시도 할 수 없었기 때문에 그들에 대한 혐오감을 느꼈다.

CompositeId에 해당하는 경우가 있지만 대부분의 경우 설명하지 않은 경우가 있습니다. 실제 언어에 대한 가치를 얻는 간단한 사전 및 편의 속성은 훨씬 간단하며 모든 언어에 대해 다른 모든 속성을 복제하지 않아도됩니다.

+0

그들은 항상 모든 언어에서 항상 같은가요? 나도 몰라 .... 내가 성취하려고 시도한 것은 모든 새로운 엔티티에 로컬 리 제이션 로직을 적용하는 것이다. 나는 인터페이스에서 상속 받고 마술을하게한다. 그 작은 기술적 제약 .. –

+1

몇 가지 단점 : 1) 당신은 항상 ID로 쿼리 할 때 언어를 알아야합니다 2) 당신은 항상 각 쿼리에 언어를 추가해야합니다 3) 당신은 자신을 관리해야 ID를 (사용할 수 없습니다 compositeId가있는 기존 idgenerator) 4) Category.Color, Category.Type 등이 각 언어에 대해 중복됩니다. – Firo

+0

5) 프로그램에서 언어를 전환 할 때 엔티티를 다시로드해야합니다. 6) 현지화 된 항목이 누락 된 경우 폴백을 구현합니다. 사전에 기본값이있는 대신 기본 언어 엔티티에 대해 데이터베이스를 다시 쿼리해야합니다. – Firo