2012-11-05 23 views
0

我在VS 2010中使用EF 3.5。我有一個返回結構的方法。在結構中有一個對象armatuur。當結構返回時,我想從armatuur實例訪問相關的對象。使用語句後如何訪問相關對象已在Entity Framework中完成?

然而

方法返回結構:

public LampPostDetail getLamppostInfo(int id) 
{ 
    LampPostDetail lpd; 

    lpd.xPos = 0; 
    lpd.ypos = 0; 
    lpd.armatuur = new Armatuur(); 

    //get the info from object 
    using (var db = new OvisionDBEntities()) 
    { 
     var objects = from o in db.Objects 
         where o.ObjectId == id 
         select o; 

     foreach (OVSL.Data.Object o in objects) 
     { 
      lpd.xPos = o.XCoordinatie; 
      lpd.ypos = o.YCoordinatie; 
      lpd.armatuur = o.Armatuur; //which is a table in my db 
     } 

     return lpd; 
    } 
} 

結構:

public struct LampPostDetail 
{ 
    #region [ Data Members (14)] 
    //lamppost info 
    public double? xPos; 
    public double? ypos; 

    //a lamppost can have several armaturen 
    public OVSL.Data.Armatuur armatuur; //is a table in my db 

    #endregion [ Data Members ] 
} 

當我的客戶這樣做:

LampPostDetail lpd = client.getLamppostInfo(id); 
string brand = lpd.armatuur.producer.name; //producer is related object of armatuur 

我得到的ObjectDisposedException。我知道發生這種情況是因爲LampPostDetail對象在using塊完成後被釋放。但是,我如何得到這個工作?在我將其返回給客戶端之前檢索我需要的所有信息(如品牌名稱等)不是一種選擇。

+0

究竟是什麼行引發異常?我知道它在你的客戶端,但很難確切地說出哪一行是問題。 – tmesser

+0

您是否有能力修改getLamppostInfo方法? – user957902

+0

@yyy,它是生產者被要求的生產線。是的,我可以編輯該方法。 – jorrebor

回答

0

這裏得到的唯一東西是OvisionDBEntities上下文。之後,沒有延遲加載是可能的。如何處理?事實上,你的問題是:你能做什麼來隨時爲用戶提供用戶操作可能需要的所有數據?我看到三個或四個選項:

  1. 的標準方法能夠訪問上下文處理後實體的導航屬性呼籲Includefrom o in db.Objects.Include("Armatuur.Producer")...但是,這顯然不是一個選擇。

  2. 讓上下文處於活動狀態,並依靠延遲加載來按需獲取數據。這可能是您的一個選擇。但長期存在的上下文可能會導致問題,例如隨着內部更改跟蹤記錄的增長,性能會逐漸下降,而過時的緩存數據會導致遍佈整個地方的刷新/重新加載語句。

  3. 替代導航屬性/延遲加載從每次調用使用上下文實例的服務/存儲庫層按需提取數據。我認爲這個選擇可以爲你工作。設計用例可以用較少的數據來完成(因此Include可能足以滿足要求)。沒有人可以採用數千行和數十列的網格。設計良好的用戶交互可以大大減少輸入到客戶端的數據量(而且我只是在獲取這些信息之初)。

+0

選項4只需要最少的代碼修改就可以了。 UI設計的確應該發展;) – jorrebor

0

它不是你的LampPostDetail,它正在處理中,它是從它引用的數據庫或Armatuur引用的對象中檢索的Armatuur對象。

我可以看到兩個選項來解決這個問題。首先是使Entity上下文成爲getLamppostInfo info方法的可選參數。由於使用的是3.5,你將不得不做的過載,以保持一部開拓創新的功能:

public LampPostDetail getLamppostInfo(int id,OvisionDBEntities context) 
{ 
... 
    try 
    { 
     OvisionDBEntities db; 
     if (context == null) 
      db = new OvisionDBEntities(); 
     else 
      db = context; 
    ... 
    } 
    finally 
    { 
     if (context == null && db != null) 
     db.Dispose() // or close maybe 
    } 

    retun lpd; 

} 

// Overloaded function to keep orignal functionality (C# 3.5 does not have 
// optional parameters) 
public LampPostDetail getLamppostInfo(int id) 
{ 
    return LampPostDetail(id,null) 
} 

現在你可以稱其爲:

using (var db = new OvisionDBEntities()) 
{ 
    LampPostDetail lpd = client.getLamppostInfo(id,db); 
    string brand = lpd.armatuur.producer.name; 
}  

當你嘗試引用你的對象仍然存在他們。

另一種選擇是在處理它之前,將被引用的對象從實體上下文中分離出來。

db.Detach(o.Armatuur); 

但是,我不相信分離任何對象引用的對象。所以你將不得不交叉參考樹並分離thoes對象。

+0

呃!格式化發生了什麼?我所有的縮進都消失了! – user957902

+0

好吧謝謝你的時間,我會在工作中明天嘗試一下,我會告訴你的! – jorrebor

相關問題