2015-08-18 54 views
2

我試圖用實體框架實現延遲加載。我會很早就承認,我從來沒有做過這件事,我正在掙扎。所以我所嘗試的一切都是基於我在這裏找到的文章。基本上我現在正在獲取底層連接意外關閉錯誤消息。延遲加載 - (實體框架)底層連接意外關閉

當我執行WCF跟蹤時,表示在嘗試使用DataContractResolver對參數http://tempuri.org...Consider進行序列化時發生錯誤(如果正在使用DataContractSerializer或將任何類型未知的靜態添加到已知類型的列表中)。

所以我研究了DataContractResolver,並且對於如何實現這一點還不清楚,並且我還不清楚我如何知道我是否使用DataContractSerializer。就像我說的,我是新手。

這裏是我當前的代碼:

public OMBCase GetOMBCaseByCaseId(long caseId) 
    { 
     //using (AWCTSDBEntities context = new AWCTSDBEntities()) 
     AWCTSDBEntities context = new AWCTSDBEntities(); 
     //{ 
     try 
     { 
      context.Configuration.ProxyCreationEnabled = true; 
      context.Configuration.LazyLoadingEnabled = true; 
      context.Configuration.AutoDetectChangesEnabled = false; 

      ((IObjectContextAdapter)context).ObjectContext.CommandTimeout = 120; 
      context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

      var caseRecQuery = (from c in context.Cases 
           where (c.CaseId == caseId && c.SystemTypeCode == SystemCodes.OMB) 
           select c).OfType<OMBCase>(); 

      var caseRecord = caseRecQuery.Single(); 
      var soldierDetails = caseRecord.Soldier; 
      var soldierAddress = soldierDetails.Addresses.ToList(); 
      foreach (var p in soldierDetails.Addresses) 
      { 
       var soldierAddressPurpose = p.AddressPurposes; 
       foreach (var ap in soldierAddressPurpose) 
       { 
        var purpose = ap; 
       } 
      } 
      var soldierTelehone = soldierDetails.Telephones.ToList(); 
      var soldierEmail = soldierDetails.Emails.ToList(); 
      var soldierContacts = soldierDetails.Contacts.ToList(); 
      foreach (var ca in soldierDetails.Contacts) 
      { 
       var contactAddress = ca.Addresses; 
       foreach (var cp in contactAddress) 
       { 
        var contactAddressPurposes = cp.AddressPurposes; 
       } 
      } 
      foreach (var ce in soldierDetails.Contacts) 
      { 
       var contactEmails = ce.Emails; 
      } 
      foreach (var ct in soldierDetails.Contacts) 
      { 
       var contactTelephone = ct.Telephones; 
      } 
      var personInterviewed = caseRecord.PersonInterviewed; 
      var createdByUser = caseRecord.CreatedByUser; 
      context.Dispose(); 
      return (caseRecord); 
      // 
     } 
     catch (NullReferenceException) 
     { 
      context.Dispose(); 
      return (null); 
     } 
     catch (Exception e) 
     { 
      context.Dispose(); 
      WriteToLogFile(e); 
      return (null); 
      // } 
     } 


    } 

任何指導,你可以提供到哪裏何去何從將不勝感激。

在此先感謝您提供的任何幫助。

羅德尼

+0

什麼線它拋出一個例外?它是在您返回值之後嗎? – lucrativelucas

+0

它正在返回。當我在調試器中查看代碼時,我看到所有的值都回來了,而且都很好看。然後我打回來,一切都死了。 –

+0

在調用context.Dispose();之後查看這些值。我有一種感覺,當這種情況發生時,他們都會走出窗外。你以前的問題是類似的,這個問題是否同樣適用? http://stackoverflow.com/questions/31703801/entity-framework-lazy-load-with-multiple-includes – lucrativelucas

回答

0

「延遲加載」不填充任何類中,直到實際值要求。這也意味着,當context超出範圍(或被處置)時,查詢中的對象不合適。

它看起來像你的程序是這樣做的:

Logic logic logic; // Logic before getting case 
var case = GetOMBCaseByCaseId(caseid); 
Logic logic logic; // Logic performed on case 

延遲加載效果最好,像這樣,在上下文之前執行邏輯場景超出範圍:

ProcessOMBCaseByCaseId(Int32 caseid) 
{ 
    using (AWCTSDBEntities context = new AWCTSDBEntities()) 
    { 
     var caseRecQuery = (from c in context.Cases 
          where (c.CaseId == caseId && c.SystemTypeCode == SystemCodes.OMB) 
          select c).OfType<OMBCase>(); 

     Logic logic logic; // Logic performed on case 
    } 
} 
+0

我可能在這裏表現出一些無知,但是這個調用在後端服務器上的WCF域中結束,消耗它的邏輯直到它返回到前端之後才被使用。所以當我看到你在說什麼時,我不清楚如何實現它。 –

相關問題