2012-03-04 48 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();