EntityFramework - 核心项目与具有共享实体的Web项目?

时间:2012-03-04 21:54:02

标签: asp.net architecture entity-framework-4 dbcontext

我遇到了麻烦......

我有一个“核心”项目,其中包含一组常用功能,例如标记。标记包括一组实体,其中一些实体包括TagObjectTag

他们基本上看起来像这样:

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

我的“核心”项目还包含一个名为DbContext的{​​{1}}数据模型。所以我可以做到以下几点:

CoreEntities

我还有一个“Web”项目,其中包含特定于我的网站的对象,例如 Recipe 。食谱看起来像这样:

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

我的“Web”项目还有一个带有相应上下文(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记录。当尝试加入实体时,我收到以下错误:“指定的LINQ表达式包含对与不同上下文关联的查询的引用”。 这是否意味着我需要将ObjectTag添加到我的ObjectTag上下文中?可能还有其他一些有效的方式加入这两个?

2 个答案:

答案 0 :(得分:1)

使用EF时,不要将相关实体拆分为不同的上下文。实体类可以驻留在不同的名称空间(项目等)中,但它们应该是单个上下文的一部分,以便定义丰富的模型。

最好创建一个包含所有域实体的类​​库项目。这将允许您声明导航属性而无需相互依赖的项目模块。

查询非常简单

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

答案 1 :(得分:0)

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