【问题标题】:EF: Cross edmx (same DB) linq-to-entites queryEF:跨 edmx(相同数据库)linq-to-entities 查询
【发布时间】:2011-06-02 03:57:28
【问题描述】:

如何在单独的程序集中使用两个 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 查询,而不是将结果从第一部分读取到内存,然后将它们作为第二部分查询的输入返回到数据库。



相关,但不是我要找的:

【问题讨论】:

    标签: entity-framework entity-framework-4 linq-to-entities multiple-schema


    【解决方案1】:

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

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

    【讨论】:

    • 我预计它需要使用单个上下文,并且正在研究一种合并 EDMX 的方法来执行此操作,但是,您的 hack 可能更简单。
    • 内部使用的容器名称是什么?
    • - 用于缓存 ObjectContext 的元数据,以便更快地创建上下文?
    • 我认为这是您所指的链接中的解决方案:“要使用两个架构集创建单个上下文,您将使用接受 EntityConnectionString 的 ObjectContext 构造函数。在元数据中连接字符串的参数,指定两组文件的路径。"
    • 是的,这就是解决方案。例如,如果您想使用 EntityKey 查找实体,则需要容器名称。
    【解决方案2】:

    另一个可行的方法是将两个 EDMX 合并为第三个, 然后从中创建一个 ObjectContext 来访问这两个部分。

    所有 3 个 EDMX 都需要使用相同的命名空间。

    可以通过编程方式进行合并,合并的结果应该是: EDMX、SSDL、CSDL、MSL 文件; EDMX 用于 T4 和其他用于作为资源嵌入。

    两个源 EDMX 中的任何实体和关联都必须具有完全相同的定义(概念和映射)。

    您将能够对跨两个源 EDMX 运行的合并 EDMX 上下文运行查询, 通过 ID 或任何其他标准加入。


    有关连接结果的更多信息,请参阅此链接:
    How can I create an ObjectContext from separate ssdl + csdl + msl files and no edmx?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多