EF:交叉edmx(相同的DB)linq到实体查询

时间:2011-05-24 18:25:58

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

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

E.g。

这就是我想要做的事情:

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表达式包含对与不同上下文关联的查询的引用。”

>即使实体2被实体1替换,也会抛出此异常 (即使两个上下文都来自相同的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查询,而不是将结果从第一部分读取到内存,然后将它们作为第二部分查询的输入返回到数据库。



相关,但不是我要找的东西:

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

另一个有效的黑客,将两个EDMX合并为第三个, 然后从中创建一个访问这两个部分的ObjectContext。

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

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

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

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


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