2012-01-10 4 views
2

백업 필드 속성에 액세스하려고 할 때 속성을 확인할 수 없습니다 그것이 능동 nhibernate와 함께 돌아 오는 interace에 대한 쿼리 속성을 해결할 수 없습니다. SpecialFoo를 사용하도록 변경하면 작동합니다.능통 자 NHibernate 내가 다음과 같은 클래스가

//Doesn't Work 
return (from s in _session.Linq<SpecialFoo>() 
      where s.Foo.ID == id 
      select s).ToList(); 

//Works 
return (from s in _session.Linq<SpecialFoo>() 
      where s.SpecialFoo.ID == id 
      select s).ToList(); 

이 문제를 해결하는 방법에 대한 단서와 그 이유는 무엇입니까? 나는 이것과 관련된 Stackoverflow에 관한 여러 가지 질문을 읽었지만, 불행히도 제공되는 솔루션 중 어느 것도 나의 특별한 경우에 적용될 수없는 것으로 보였다.

답변

1

기본적으로 속성에 대해 설정을 시도하지만 보호되어 있으므로 액세스 할 수 없습니다.

다른 액세스를 지정하기 위해 매핑을 업데이트 할 수 있습니다.

private SpecialFoo _specialFoo { get; set; } 
public virtual SpecialFoo SpecialFoo 
{ 
    get { return _specialFoo; } 
    protected internal set { _specialFoo = value; } 
} 

편집 : 아래의 질문에 대한 응답으로

.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore) 

그러나이 경우 귀하의 재산 뒷면 필드와 같은 속성 이름과 동일해야합니다

.

Backfield를 매핑 된 속성과 동일하게 유지하면 _specialFoo 배경 필드를 사용하도록 Foo 속성을 업데이트 할 수 있습니다.

회원을 밝힐 수 있습니다.

References(Reveal.Member<SpecialFoo>("_foo")); 

https://github.com/jagregory/fluent-nhibernate/wiki/Mapping-private-properties

이것은 직접적, 오히려 이름을 추론보다 사용자가 정의한 이름을 주어진 백업 필드를 찾을 것을 의미합니다 (I 내 머리 위로 떨어져을 작성한으로이 안된) 재산 및 명명 규칙에 따라

+0

감사합니다. 단일 백킹 필드를 유지하는 방법이 있습니까? 인터페이스와 실제 객체를 모두 사용하고 싶습니다. 하나의 백킹 필드 만 갖고 싶습니다. – Zipper

+0

@Zipper - 답변을 업데이트했습니다. – Phill

+0

@Phill, 감사합니다! Unfortunatelly,'Foo'가 _readony_ 속성 일 때'where.Foo.ID == id'를 어떻게 수행하는지는 아직 명확하지 않습니다. 내 경우,'SpecialFoo'는 보호 된'IList' 콜렉션이고'HasMany'로 매핑됩니다. 그러나'푸 '는 그렇지 않다. 'Foo '는이 보호 된 _IList_'SpecialFoo'에 대한 읽기 전용입니다 .IEnumerable_입니다. –

관련 문제