1

如何在单独的程序集中但在相同数据库之上使用两个 EDMX
来创建同时使用它们的 linq-to-entities 查询?

例如

这就是我想要做的:

using (var context1 = new Entities1())
{
    using (var context2 = new Entities2())
    {
        var items2 = context2.Items.Where(item2 => item2.Color == "Red");

        var query = context1.Items.Where(item =>
            items2.Any(item2 => item2.PainterId == item.PainterId));
    }
}

 > 这会导致 NotSupportedException。
   消息:“指定的 LINQ 表达式包含对与不同上下文关联的查询的引用。”

 > 即使将 Entities2 替换为 Entities1
   (即使两个上下文都来自同一个 EDMX)并且都使用相同的连接字符串,也会引发此异常。



为了比较,另一方面,这有效并导致单个 SQL 语句:

using (var context1 = new Entities1())
{
    var items2 = context2.Items.Where(item2 => item2.Color == "Red");

    var query = context1.Items.Where(item =>
        items2.Any(item2 => item2.PainterId == item.PainterId));
}


约束:

我的意图是使用两个带有设计器支持的 EDMX——不要以破坏设计器或在从数据库更新时被覆盖的方式入侵 EDMX。

EDMX #1 不知道 EDMX #2(但是 #2 可以知道 #1)。

我希望将结果转换为单个 SQL 查询,而不是将结果从第一部分读取到内存,然后将它们作为第二部分查询的输入返回到数据库。



相关,但不是我要找的:

4

2 回答 2

2

您以回答问题的方式限制了您的要求:不,这是不可能的。最好且唯一推荐的解决方案在第二个链接中,该链接引用了 ADO.NET 团队博客关于使用大型模型的文章。

我写了一个关于 hack 的文章(我在一个项目中成功使用过),它同样有效,但它还有另一个缺点 - 您必须对两个 EDMX 使用单一上下文。即使它有效,我也不建议使用这种方式,因为它可能具有未开发的缺点,因为它在内部省略了在 EF 中的许多其他地方使用的容器名称。

于 2011-05-25T07:27:43.473 回答
0

Another hack that works, merging the two EDMXs into a third one, then creating one ObjectContext out of it that accesses both parts.

All 3 EDMXs will need to use the same namespace.

Merging can be performed programmatically, result of merge should be: EDMX, SSDL, CSDL, MSL files; EDMX for T4s and the others for embedding as resources.

Any entities and associations that are in both source EDMXs must have exact same definition (conceptual and mapping).

You will be able to run queries on merged EDMX's context that run across both source EDMXs, joining by IDs or any other criteria.


See this link for more info on wiring up the results:
How can I create an ObjectContext from separate ssdl + csdl + msl files and no edmx?

于 2011-05-25T15:55:28.407 回答