2009-08-17 47 views
0

好吧,讓我解釋一下我正在嘗試做什麼。Asp.Net MVC實體框架父子可重寫值

我有一張名爲WebsitePage的表格,其中包含我網站上的所有頁面以及關於它們的一些信息。然後,我爲我的所有客戶提供客戶表。然後我有另一個名爲CustomerWebsitePage的表,它存儲了WebsitePage表中某些列的客戶值。

因此,使用實體框架,我導入了這三個表。我想要做的是返回一個強類型的WebsitePage列表,該列表具有來自CustomerWebsitePage的任何值,如果有任何值。所以,舉例來說,我的一位客戶爲我的一個網站頁面添加了一個CustomerWebsitePageName。我想在這種情況下返回一個包含CustomerWebsitePageName而不是WebsitePage Name的WebsitePages列表。但是,由於沒有被覆蓋,原來的網頁名稱就是其他所有內容。

這裏的踢球是我的WebsitePage表有一個父/子關係本身的外鍵。所以,我也想同時返回子網站頁面。我嘗試使用函數導入來獲得我想要的,但是當然我失去了ChildPages。

我已經嘗試過幾乎所有使用實體框架和LINQ來獲得我想要的內容。但到目前爲止,幾乎所有我嘗試的結果都是拋出異常。這裏有幾個:

  • 的EntityCollection已經初始化
  • 實體或複雜類型「MyEntityModel.WebsitePage」不能在LINQ到實體查詢構造。

我有我怎樣才能解決這一切一個想法,這將是對ParentPageID複製到我的WebsitePage表,但這似乎真的違反了很多原則,我真的只是不想要添加與此相關的維護頭痛。

任何人有任何想法如何完成這種類型的事情?

A simple DB diagram. http://images.tehone.com/screenshots/2009-08-17_013009.png

+0

它看起來像你寫了一個壞的LINQ to Entities查詢,但沒有實際看到的是查詢和使用它的代碼,這是很難做到當然。乍看之下,您的數據庫映射看起來確實如此。 – 2009-08-17 13:32:51

回答

1

,你需要返回的對象是CustomerWebsitePage而不是WebsitePage。原因是無論你返回什麼對象都必須知道該客戶,因爲該屬性將需要它來確定使用哪個字段(CustomerPage或WebsitePage)。

考慮到您可以使用CustomerWebsitePage.GetAllPagesForCustomer(Customer c)函數來返回頁面的枚舉。但是,要實現您正在尋找的功能,您必須在CustomerWebsitePage中實現一些通讀屬性。我們來看一下Name的例子。這裏將是如何實現它在CustomerWebsitePage:

public string Name 
{ 
    get{ if(String.IsNullOrEmpty(CustomerWebsitePageName)) 
      return WebsitePage.Name; 
     return CustomerWebsitePageName; } 
} 

對於兒童的網頁,你可以有一個屬性:

public IEnumerable<CustomerWebPage> Children 
{ 
    get 
    { 
     return WebsitePage.Children.Select(it => it.Customer.CustomerID == this.CustomerID);  } 
} 

請注意,這個設置,您不能運行EF LINQ查詢這些新字段(因爲它們只存在於對象本身中,而不存在於數據庫映射中)。如果你想無縫地加載所有的孩子,你可以使用Load()來加入代碼,但是這會讓你付出高昂的代價。爲了確保所有的孩子都加載,請嘗試以下操作加載功能:

IEnumerable<CusomterWebPage> GetAllPagesForCustomer(Customer c) 
{ 
    return Context.CustomerWebPageSet.Include("WebsitePage").Where(it => it.Customer.CustomerID == c.CustomerID); 
} 
+0

感謝您的建議。我決定完全採用不同的路線,而不是使用強類型對象來重寫。相反,我只是在處理這些數據時自己處理它。我想我可以說,這是使用Entity框架在嘗試通過重寫某些值進行這種繼承時的一個限制。誰知道,我甚至可以使用實體框架來創建這個繼承。但至少現在,我只是手動處理它。 謝謝。 – TehOne 2009-08-20 16:30:45