2011-02-23 163 views
32

我在我的數據庫中有很多字段的表。 大部分時間我需要所有這些字段。然而,有一種情況是我只需要一些字段,而我正在加載大量的行。將兩個不同的實體映射到同一個表中?

我想要做的是手動添加一個實體,然後將其映射到原始表,但刪除我不需要的列。我處理這件事,但我得到的相當不言自明的錯誤:

問題的映射片段 ... EntitySets「FmvHistoryTrimmed」和 「FMVHistories」都映射到 表「FMVHistory」。他們的主鍵 可能會發生碰撞。

有沒有其他方法我應該去做這件事?同樣,大部分時間都使用了所有的列,所以我不想裁減原始實體並將「額外」字段設置爲複雜類型。

+0

我有一個解決方法,從Aducci,但我會離開這個沒有回答,如果任何人有一個實際的EF方式來完成這個我最初尋找的方式 – 2011-02-23 16:53:53

回答

30

您不能將兩個常規實體映射到同一個表中。你有幾種選擇:

  1. 使用表分割。
  2. 與投影到非實體類型(如@Aducci建議)
  3. 使用QueryView
  4. 使用數據庫視圖或直接使用DefiningQuery自定義查詢

表拆分

Table splitting讓你以1:1關係將表映射到兩個實體。第一個實體將只包含您始終需要的PK和字段子集。第二個實體將包含所有其他領域和PK。兩個實體都將包含導航屬性。現在,如果只需要字段子集,您將查詢第一個實體。如果您需要所有字段,您將查詢第一個實體並將navifation屬性包含到第二個實體。如果您需要,您也可以延遲加載第二個實體。

QueryView

QueryView是直接在映射(MSL)定義ESQL查詢並將其映射到新的只讀實體類型。您可以使用QueryView來定義完整實體到子實體的投影。 QueryView必須在EDMX中手動定義(它在設計器中不可用)。我知道QueryView在代碼中不可用,但它實際上與非實體類型的自定義投影相同。

DefiningQuery

DefiningQuery是直接在您的存儲模式(SSDL)定義的自定義查詢。定義查詢通常在映射到數據庫視圖時使用,但您可以將其用於任何自定義SQL SELECT。您將查詢的結果映射爲只讀實體類型。定義查詢必須在EDMX中手動定義(它在設計器中不可用)。它在代碼中也不是直接可用的,但實際上與在DbDatabase上調用SqlQuery相同。 DefiningQuery的問題是,一旦你在SSDL中手動定義它,你就不能使用從數據庫中更新模型,因爲這個操作取代了完整的SSDL並刪除了你的查詢定義。

+0

下面是一個非常簡單的MSDN教程,它介紹了實體拆分技術:http://msdn.microsoft.com/en-us/data/jj715646.aspx但是,根據具有主鍵的數據模型結構,您可能有重塑模型。 – Flea 2013-05-11 15:31:58

+0

可以在休眠中實現表拆分嗎? – 2013-12-30 12:40:23

+0

我試圖按照[這裏](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-4-table-splitting)的描述來實現表分割。發生了什麼事是EF堅持要將共享字段重命名爲XXXX1。例如,鏈接{int LinkId; int DocIdRight; int DocIdLeft}和LinkPartial {int LinkId; int DocIdRight;} ==>更新LinkPartial對象時,EF試圖更新DocIdRight和DocIdRight1。 – Dror 2014-10-10 21:10:47

7

我會在只包含您需要的數據的數據庫上創建一個View,並將View添加到您的實體數據模型中。

如果您不想修改數據庫,您可以創建一個Linq實體或投影到POCO類的ESQL語句,僅使用所需的信息。

public IQueryable<SimpleObject> GetView(DBContext context) 
{ 
    return (from obj in context.ComplexObjects 
      select new SimpleObject() { Property1 = obj.Property1, 
             Property1 = obj.Property2 
             }); 
} 
+0

我絕對不想創建一個視圖,但自定義linq表達式應該可以工作。在那裏也有1..0 | 1的關係,但是一個簡單的linq外連接也應該把它拉進去。我只是覺得在EF設計師中映射它會更加優雅。謝謝您的回答! – 2011-02-23 16:53:10

相關問題