2013-03-20 4 views
0

저는 많은 하위 레코드가있는 상위 레코드가있는 레코드 구조를 가지고 있습니다. 같은 페이지에서 나는 모든 아이들을 얻기 위해 몇 가지 질문을 할 것입니다.레코드 ID가 손실 됨

나중에 쿼리를 확장하면 레코드 집합이 생성되어 "프록시"가 표시됩니다. 모든 것이 일반적으로 존재하기 때문에 레코드에서 데이터를 가져 오는 것이 좋습니다. 내가 가진 유일한 문제는 내가 기록 "ID"를 붙잡기 위해 갈 때 그것이 항상 "0"이기 때문에 그것이 프록시이기 때문이다. 이렇게하면 레코드 ID를 "선택한 값"으로 사용하는 드롭 다운 목록을 작성할 때 상당히 힘들어집니다. 이 점을 악화시키는 것은 무작위입니다. 따라서 5 개 항목 중 2 개는 프록시이므로 ID가 "0"입니다.

evict를 사용하여 강제로로드 할 수 있습니다. 그러나 게으른로드 (Grid의 경우)가 필요할 때 게으른로드를 중지하고 그리드 컨텐츠를 즉석에서 표시 할 수 없기 때문에 제거가 좋지 않습니다.

ISession session = FluentSessionManager.SessionFactory.OpenSession(); 
session.BeginTransaction(); 
CurrentSessionContext.Bind(session); 

나는 심지어 내 쿼리 내에서 "("열망을 MyTable) ".SetFetchMode"를 사용하고 그것은 여전히 ​​"프록시"보여줍니다

나는 내 세션을 시작하려면 다음을 사용하고 있습니다.

프록시는 정상이지만 기록 ID가 필요합니다. 다른 누구든지이 문제를 해결하고 간단한 수정을합니까?

나는 이것에 대한 도움을 크게 주시면 감사하겠습니다.

감사합니다. 나는 실버를 발견

public IList<Patients> GetAllPatients() 
    { 
     return FluentSessionManager.GetSession() 
      .CreateCriteria<Patients>() 
      .Add(Expression.Eq("IsDeleted", false)) 
      .SetFetchMode("Children", Eager) 
      .List<Patients>(); 
    } 
+0

첫 번째 단락에서 언급 한 코드를 여기에 모두 붙여 넣을 수 있습니까? –

+0

레코드가 "Proxy"이므로 ID가 0 인 하위 항목을 제공하는 쿼리를 사용했습니다. 모든 기록이 "프록시"는 아니므로주의하십시오. 그것들은 다소 간헐적입니다. –

답변

0

: 요청에 따라

, 여기가 "프록시"로 나타나지 않기 때문에 나는 Patients.Children가 "0"의 ID를 가진 초래할 것를 실행하고 쿼리입니다 레코드 ID를 잃어버린 프록시 문제를 해결하는 글 머리 기호! 문제를 해결하기 위해 ClearCache를 사용하고있었습니다. 이는 레코드 구조의 첫 번째 레이어에 대해서는 정상적으로 작동했습니다. 그러나 Parient.Child.AnotherLevel.OneMoreLevel.DownOneMore 시나리오를 사용하면 4 단계와 5 단계가 수정되지 않습니다. 내가 생각해내는이 방법은 그렇습니다. 나는 또한 하나에서 많은 매핑이 뒤 따르는 많은 것들을 가질 때 주로 그 자체를 제시한다는 것을 발견했다. 그래서 여기에 같은 문제에 부딪 치고있는 다른 모든 사람들에 대한 대답이 있습니다.

도메인 구조 :

public class Parent : DomainBase<int> 
{ 
    public virtual int ID { get { return base.ID2; } set { base.ID2 = value; } } 

    public virtual string Name { get; set; } 
    .... 
} 

DomainBase :

public abstract class DomainBase<Y>, IDomainBase<Y> 
{ 
    public virtual Y ID //Everything has an identity Key. 
    { 
     get; 
     set; 
    } 

    protected internal virtual Y ID2 // Real identity Key 
    { 
     get 
     { 
      Y myID = this.ID; 
      if (typeof(Y).ToString() == "System.Int32") 
      { 
       if (int.Parse(this.ID.ToString()) == 0) 
       { 
        myID = ReadOnlyID; 
       } 
      } 

      return myID; 
     } 
     set 
     { 
      this.ID = value; 
      this.ReadOnlyID = value; 
     } 
    } 
    protected internal virtual Y ReadOnlyID { get; set; } // Real identity Key 
} 

IDomainBase :

public interface IDomainBase<Y> 
{ 
    Y ID { get; set; } 
} 

도메인 매핑 :

public class ParentMap : ClassMap<Parent, int> 
{ 
    public ParentMap() 
    { 
     Schema("dbo"); 
     Table("Parent"); 

     Id(x => x.ID); 

     Map(x => x.Name); 
     .... 
    } 
} 

ClassMap :

public class ClassMap<TEntityType, TIdType> : FluentNHibernate.Mapping.ClassMap<TEntityType> where TEntityType : DomainBase<TIdType> 
{ 
    public ClassMap() 
    { 
     Id(x => x.ID, "ID"); 
     Map(x => x.ReadOnlyID, "ID").ReadOnly(); 
    } 
}