c# - 跨多个项目的 EntityFramework 上下文或在两个上下文之间加入
问题描述
我有一个包含 EF Core db 上下文的类库项目。这是框架的一部分。
我想扩展此上下文,但不更改框架项目。第二个上下文将使用相同的数据库。
我在不同的类库中创建了另一个数据库上下文(类似于this)。这工作正常,我可以与其他上下文分开进行查询和创建迁移。
但是例如,如果我在第一个上下文中有一个 User 实体,而在第二个上下文中有一个 UserBooks,当我尝试join
在这两个上下文之间创建一个它不起作用时,会出现异常
System.ArgumentNullException:值不能为空。参数名称:实体类型
这是一个已知问题。
也尝试使用最新的 NuGet 包3.0.0-preview3.19153.1但唯一的区别是错误消息更好
不能在单个查询执行中使用多个 DbContext 实例。确保查询使用单个上下文实例
有没有办法
一个。在两个上下文之间进行连接
或者
湾。在单独的项目中扩展上下文而不对“主要”上下文进行任何(或最小)更改
解决方案
两个 db-contexts 意味着两个连接。您不能通过不同的连接加入。
1. 将数据加载到程序中
您可以将数据加载到您的程序并加入其中。请注意,这在大数据集上很危险。
var customers = new Ctx1().Customers.ToList(); // ToList() loads the data into your program
var orders = new Ctx2().Orders.ToList();
// Now we're not in the db anymore. We can do a simple List-Join:
customers.Join(orders, c => c.CustomerId, o => o.CustomerId, (c, o) => new { Customer = c, Order = o });
2.扩展你现有的上下文
如果你想坚持一个连接,你可以简单地扩展你的上下文。请注意,您以这种方式进行一项交易。
public class FrameworkContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class ExtendedContext : FrameworkContext
{
public DbSet<Order> Orders { get; set; }
}
现在您可以加入:
var ctx = new ExtendedContext();
var myResult = ctx.customers.Join(ctx.orders, c => c.CustomerId, o => o.CustomerId, (c, o) => new { Customer = c, Order = o });
推荐阅读
- c++ - Opencv imshow 显示奇怪的图像
- java - Umano AndroidSlidingUpPanel 如何在面板可见时禁用触摸?
- java - JDialog 在 Windows 10 上具有隐式最小宽度,如何绕过它?
- python - Python 碰撞检测与边界的 x 和 y 坐标
- python - 无法生成 tkinter 滚动条
- mysql - 如何在sql中每天一次执行触发器
- javascript - 以模态显示搜索栏查询结果
- reactjs - 测试解构的上下文消费者
- javascript - 如何在 JavaScript 中为 HTML 元素使用动态 id?
- mysql - 内部连接中的mysql随机选择