2009-10-19 39 views
0

假設我有項目MyData,然後添加MyDb.edmx與EF嚮導。在我的數據庫中,我有表Person。然後我將在EF模型中獲得一個實體Person。如何在實體類中使用實體上下文以獲得性能?

然後我想通過部分類像一個分隔文件person.cs來擴展這個人:

namespace MyData 
{ 
    public partial class Person 
    { 
     [DataMember] 
     public int MyTotal 
     { 
      get 
      { 
       int count = 0; 
       using (MyEntities ctx = new MyEntities()) 
       { 
        //run some linq to get calc based on other entities 
       } 
       return count; 
      } 
     } 
} 

它工作正常。然後在客戶端,我可以使用屬性MyTotal獲取實體Person實例。 問題是:當我想要列出Person在客戶端(如silverlight)時,性能非常糟糕,因爲對於Person的每個實例,它都會導致SQL DB連接併爲MyTotal運行一個SQL。

如果我有更多十種這樣的擴展屬性,性能將會非常糟糕。 如何解決這個問題?

回答

1

首先,我強烈建議不要把它放在一個屬性中。屬性應該有很少或沒有代碼 - 在這種情況下,你將要執行重要的邏輯,使用方法會更有意義(即:GetMyTotal()),因爲這會使它更明顯在這一點上你將要運行一個潛在的長時間運行的進程的用戶。

這就是說,你有幾個選擇在這裏。我個人的偏好是預取這些信息。你可以改變你的實體拉results from a Stored Procedure instead of a table。這將允許您在服務器上預先計算所有這些值,並且只通過線路提取單個結果。

這也可以讓你在客戶端「緩存」這個值,這意味着你可以保留它的一個屬性(因爲總值已經在實體中)。

+0

當使用EF自動生成的所有實體時,它將保持所有關係(關聯)。如果使用由存儲過程檢索的自定義實體,我不確定是否保留所有這些關係。否則,您需要手動構建所有這些關聯,這會很痛苦。 – KentZhou

+0

是的,但是你正試圖添加一些東西到一個不適合自動生成實體的實體中。這是爲什麼他們添加了使用存儲過程生成實體的能力的確切場景之一。 –

+0

謝謝。如果我有幾個計算結果,並且想要將它們與People等實體關聯起來,如果不更改實體(保持所有自動生成的沒有更改),那麼更好的解決方案是什麼? – KentZhou

相關問題