我遇到了麻烦......
我有一个“核心”项目,其中包含一组常用功能,例如标记。标记包括一组实体,其中一些实体包括Tag
和ObjectTag
。
他们基本上看起来像这样:
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
上下文中?可能还有其他一些有效的方式加入这两个?
答案 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();