如何在单独的程序集中使用两个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)并且都使用相同的连接字符串。
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查询,而不是将结果从第一部分读取到内存,然后将它们作为第二部分查询的输入返回到数据库。
相关,但不是我要找的东西:
答案 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?