2013-03-20 33 views
0

我有一個記錄結構,我有一個父記錄與許多子記錄。在同一頁面上,我會有幾個查詢來獲得所有的孩子。失去記錄ID

以後的查詢當我展開它時顯示「代理」,我將獲得一個記錄集。因爲一切都在那裏,所以從記錄中獲取數據是很好的。唯一的問題是當我去抓取記錄「ID」時,它總是「0」,因爲它是代理。當我使用記錄ID作爲「選定值」時,這使得構建下拉列表非常困難。更糟糕的是它是隨機的。因此,從5個項目列表中,其中2個將具有「0」的ID,因爲它們是代理。

我可以使用evict強制它有時加載。然而,當我需要延遲加載時(對於網格),evict是不好的,因爲它殺死了懶惰的負載,我無法實時顯示網格內容。

我使用下面開始我的會議:

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

我甚至用「.SetFetchMode(‘MyTable的’,渴望)」我的查詢中,它仍然顯示‘代理’。

代理很好,但我需要記錄ID。任何人都遇到這個問題,並有一個簡單的修復?

我非常感謝這方面的幫助。

謝謝。

每要求,這裏是我運行,這將導致具有「0」的ID Patients.Children,因爲它顯示爲「代理」查詢:

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

你能不能在這裏粘貼你在第一段提到的所有代碼? – 2013-03-21 03:14:59

+0

我添加了我正在使用的查詢,因爲這些記錄是「代理」,所以我給了ID爲0的孩子。請注意,並非所有記錄都是「代理」。哪些是間歇性的。 – 2013-03-21 14:33:29

回答

0

我已經找到了銀子彈修復代理問題,你鬆開你的記錄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(); 
    } 
}