我有一个包含EF Core db上下文的类库项目。这是框架的一部分。
我想扩展此上下文,但不更改框架项目。第二个上下文将使用相同的数据库。
我在不同的类库(类似于this)中创建了另一个数据库上下文。可以,我可以独立于其他上下文进行查询和创建迁移。
但是例如,如果我在第一个上下文中有一个User实体,而在第二个上下文中有UserBooks,当我尝试在两个上下文之间创建一个join
时,它将无法正常工作,并出现异常
System.ArgumentNullException:值不能为null。 参数名称:entityType
这是已知的issue。
也尝试使用最新的NuGet软件包3.0.0-preview3.19153.1,但唯一的区别是错误消息更好
不能在单个查询执行中使用多个DbContext实例。确保查询使用单个上下文实例
有什么办法
a。在两个上下文之间建立连接
或
b。在单独的项目中扩展上下文,而无需对“主要”上下文进行任何(或最少的)更改
答案 0 :(得分:0)
两个db-contexts表示两个连接。您无法通过其他连接加入。
您可以将数据加载到程序中并加入其中。请注意,这在大数据集上很危险。
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 });
如果您要坚持一个连接,则可以简单地扩展上下文。请注意,您正以这种方式进行一笔交易。
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 });
答案 1 :(得分:0)
您可以使第二个上下文继承第一个上下文。
public class MyFirstContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class MySecondContext : MyFirstContext
{
public DbSet<UserBook> UserBooks { get; set; }
}
当然,您的第二个上下文可能在其他程序集中。现在,您只需要在应用程序中使用MySecondContext
。您将可以加入Users
和UserBooks
。