2011-11-28 188 views
0

我想創建一個自定義實體框架(4.2)實體,它將映射到我的數據庫,就像它將在代碼優先的方法中完成的一樣。實體框架:數據庫優先/代碼優先混合

問題是我的實體框架數據模型首先使用數據庫。

如何將我的自定義實體添加到實體框架的上下文中?

回答

1

如果數據庫首先表示您已經擁有從退出數據庫創建的EDMX,那麼您無法首先使用代碼。您必須從數據庫創建表格並更新模型(EDMX),以將其包含在EDMX中。

編輯基於評論:

我要創造條件,基本上是一個打火機 版本用戶的BriefUser實體,但它會從用戶 外鍵檢索性能。

這是可能的。您可以創建BriefUser作爲普通類並在查詢中使用投影。

var breifUser = (from x in context.Users 
       where ... 
       select new BriefUser 
       { 
        // Fill BreifUser's properties here 
       }).FirstOrDefault(); 

你甚至可以重構前的代碼可重用的擴展方法:

public static IQueryable<BriefUser> ProjectUser(this IQueryable<User> query) 
{ 
    return query.Select(x => new BreifUser() 
          { // Fill BreifUser's properties here }); 
} 

,並用它喜歡:

var briefUser = context.Users.ProjectUser().FirstOrDefault(...); 

也可以定義自己的新類爲「實體視圖」。第一個問題是每個表只能映射到一個實體(除了繼承或拆分等高級概念外),因此您無法將BriefUser定義爲新的實體類型,因爲將UserBriefUser映射到UserTbl會違反此規則。您必須使用稱爲QueryView的特殊結構。

QueryView是映射級別的視圖。它允許您創建新的映射類型,這是直接在EDMX的MSL部分中定義的現有映射實體的投影。投影被定義爲自定義實體SQL查詢。問題是QueryView有侷限性:

  • 它不提供所有實體SQL功能 - 例如它不支持聚合(我認爲它是真正缺少的功能)。例如,如果沒有聚合,你不能創建一個新的類型,它將包含一些相關實體的屬性。
  • 它在設計器中不受支持。您必須將EDMX編輯爲XML來定義QueryView,並且您必須自己編寫實體SQL查詢。
  • 生成的類型是一個「視圖」,它是隻讀的。

我想保持EDMX文件,而且還可以到實體 (BriefUser)添加到EF的上下文。

這是不可能的。您的BreifUser只是投影/視圖,EF無法跟蹤更改回原始表,因此您不能將BreifUser添加到上下文並保留它。在QueryView的情況下,如果您定義的自定義存儲過程不會如何分解BreifUser並修改所有相關表,則可以實現此功能。這些存儲過程必須導入到EDMX並映射到視圖實體的數據修改操作。順便說一句。如果將實體映射到數據庫視圖,也會發生同樣的情況,因爲EF將所有視圖視爲只讀視圖。

+0

是的,我確實有EDMX。所以我*必須*爲我的數據模型中的每個實體都有一個表(或視圖)?我不能只擁有一個具有映射到其他實體屬性的屬性的對象(所以它仍然在EF的上下文中)。 –

+0

對不起。我可能不明白你的問題。那麼你真的想做什麼? –

+0

假設我的數據庫中有一個UserTbl表。 此'UserTbl'表映射到我的EDMX文件中的EF實體('用戶')。 我想創建'BriefUser'實體,該實體基本上是'User'的一個較輕版本,但是它會從'User'的外鍵檢索屬性。 我想保留EDMX文件,但也能夠在EF的上下文中添加一個實體('BriefUser')。所以基本上'BriefUser'和'User'將被映射到相同的數據。 - 我希望能夠做到這一點,而無需在數據庫中創建表或視圖。 –