2012-03-04 70 views
0

我有麻煩得到這個權利...EntityFramework - 核心項目與Web項目與共享實體?

我有一個通用的功能集合,包括例如標記「核心」項目。標記包括一組實體,其中一些包括TagObjectTag

他們基本上是這樣的:

Tag  (uniqueidentifier TagId, nvarchar(max) Tag) 
ObjectTag (uniqueidentifier TagId, uniqueidentifier ObjectId) 

我的「芯」項目還包含DbContext的數據模型稱爲CoreEntities。因此,我可以做到以下幾點:

from ot in CoreEntities.Tag select ot where ot.TagId = "{someguid}" 

我也有一個「網絡」項目,該項目包括特定對象到我的網站,例如配方。食譜是這樣的:

Recipe (uniqueidentifier RecipeId, string Name) 

我的「網絡」項目也有相應的上下文(WebEntities)數據模型,提出了以下可能:

var recipes = from r in WebEntities.Recipe 
       select r 
       where r.Name == "Granny's Meatloaf" 

foreach(var r in recipes) { 
    var recipeTags = from t in CoreEntities.ObjectTag 
        select t 
        where t.ObjectId == r.RecipeId 
} 

這是非常耗費資源爲每個Recipe必須提取相應的ObjectTag記錄。嘗試加入實體時,出現以下錯誤:「指定的LINQ表達式包含對與不同上下文關聯的查詢的引用」。 這是否意味着我需要將ObjectTag添加到我的WebEntities上下文中?可能還有其他一些有效的方法來加入兩者?

+0

你真的需要兩個獨立的環境中? – veblock 2012-03-04 22:54:25

+0

@veblock:我有兩個單獨的程序集和兩個不同的'.edmx'文件。 Visual Studio會自動創建兩個上下文......我不確定是否可以以某種方式重新使用上下文?我更喜歡重複使用我的「Core」項目中的上下文,但不能將「Web」實體添加到「Core」.edmx中。文件。 – ReFocus 2012-03-05 10:57:13

+0

好吧,想不到任何簡單的解決方案。只要你有兩個不同的上下文,這將是資源密集型的。我寧願想出適合這兩種情況的通用實體模型。 – veblock 2012-03-05 22:10:28

回答

1

使用EF時,不會將相關實體拆分爲不同的上下文。實體類可以駐留在不同的名稱空間(項目等)中,但它們應該是單個上下文的一部分,以便定義豐富的模型。

創建一個包含所有域實體的類​​庫項目會更好。這將允許您聲明導航屬性,而不需要相互依賴的項目模塊。

查詢會很簡單

var recipes = from r in MyEntities.Recipe.Include("Tags") 
       select r 
       where r.Name == "Granny's Meatloaf"; 
+0

我明白,但是'DbContext'生成器創建了多個上下文。我無法將所有實體放在同一個項目中,因爲「Web」實體特定於「Web」項目。例如'Tag'實體是用於多個項目的通用功能... – ReFocus 2012-03-05 10:27:45

+0

@ReFocus仍然可以將它映射到'WebEntities'。 – Eranga 2012-03-05 12:15:35

+0

@Erange:我不明白這是怎麼做的? 'WebEntities'上下文自動生成...它包含'DbSet ',而'CoreEntities'包含'DbSet '。 「將它映射到WebEntities」是什麼意思? – ReFocus 2012-03-06 15:01:58

0
var recipes = (from r in WebEntities.Recipe 
       select r 
       where r.Name == "Granny's Meatloaf").ToList();