nhibernate는 session.load ()를 통해 프록시를 생성하지만 LINQ 또는 Criteria API를 통해서는 아닙니다.

StackOverflow https://stackoverflow.com/questions/1643905

문제

현재 프로젝트에서 이상한 문제가 있습니다. 쿼리에 대한 게으른 로딩은 작동하지 않습니다. 목록을 쿼리하면 nhibernate는 모든 협회를 별도로 가져옵니다.

작은 부분을 추출하여 별도의 솔루션에 넣었습니다. 기본적으로 내가 지금 얻은 것은 계정 테이블과 계정 동기화입니다. 둘 다 ID와 URL이 있고 ID는 단지 DB-GUID입니다.

내 수업은 다음과 같습니다.

public class HippoAccount
{
    public virtual Guid Id { get; set; }
    public virtual string Url { get; set; }
    public virtual HippoAccountSync Sync { get; set; }
}

public class HippoAccountSync
{
    public virtual Guid Id { get; set; }

    public virtual string Url { get; set; }
    public virtual HippoAccount Account { get; set; }
}

이제 내가 객체를로드하면 안내를 통해 다음과 같습니다.

var account = session.Load<HippoAccount>(accountId);
Console.WriteLine(NHibernateUtil.IsPropertyInitialized(account, "Sync"))

... 돌아옵니다 false 계정 자체는 대리입니다.

그러나 기준 API를 통해 목록을로드 할 때 :

var account = (HippoAccount)session
    .CreateCriteria(typeof (HippoAccount))
    .Add(Restrictions.Eq("Id", accountId))
    .List()[0];

... 속성 Sync 초기화를 받고 (두 번째 선택 쿼리를 발사), 반환 된 객체는 프록시가 아닙니다.

그게 기본 동작입니까? 내가 무엇을 잘못하고 있습니까?

매핑은 다음과 같습니다.

<class name="HippoAccount" table="AllAccounts">
  <id name="Id" type="guid">
    <generator class="guid"/>
  </id>
  <property name="Url" />

  <many-to-one 
           class="HippoAccountSync"
           name="Sync"
           not-found="ignore"
           property-ref="Url">
    <column name="url" />
  </many-to-one>
</class>

<class name="HippoAccountSync"
       mutable="false"
       table="Accounts">

  <id name="Id" type="guid">
    <generator class="guid"/>
  </id>

  <property name="Url">
    <column name="serviceUri" />
  </property>

  <many-to-one class="HippoAccount"
               name="Account"
               property-ref="Url"
               not-found="ignore">

    <column name="serviceUri" />
  </many-to-one>

</class>
도움이 되었습니까?

해결책

꽤 많은 연구를 마친 후에는 답을 찾았습니다. 대답, nhibernate에서 게으른 하중을 방지 할 수있는 많은 것들이 있기 때문에.

  1. 쿼리 대 세션 .LOAD : 항목을 통해 가져올 때 session.Load() 당신은 프록시를 얻습니다. 그러나 액세스하자마자 어느 속성,라고 가정 해 봅시다 Url, 게으른 하중을 지원하지 않는 모든 연관성을 포함하여 객체가 가져옵니다.

  2. Property-Ref : 게으른로드는 객체 ID에서만 작동합니다. 대상 엔티티의 다른 열을 통해 속성 관련이 해결되면 NH는 간절히 가져옵니다. 이것이 불가능하지는 않지만 단지 구현되지 않았습니다. 벌레

  3. found = "무시" 허용 유효하지 않은 외래 키, 즉 참조 된 엔티티를 찾지 못하면 NH는 널로 속성을 시작합니다. NH는 게으른 하중에 대한 속성 액세스를 가로 채지 않고 대신 객체 프록시를 할당합니다. 와 함께 not-found="ignore" 부동산이 널로 설정되어야하는지 또는 유효하지 않은 외국 키에 대한 프록시로 설정되어야하는지 결정할 수 없습니다. 이것은 속성 액세스를 가로 채어 해결할 수 있습니다.

  4. 비활성화 할 때 not-found="ignore" 그리고 property-ref 스키마 내보내기는 원형 참조를 시행하는 제약 조건을 생성합니다. 안좋다! 그런 다음 올바른 매핑은 제한된 일대일 관계가 될 것입니다. HippoAccountSync 생성기가 있어야합니다 foreign.

자원

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top