跨多个项目的实体框架上下文或在两个上下文之间联接



我有一个包含 EF Core 数据库上下文的类库项目。这是框架的一部分。

我想扩展此上下文,但不对框架项目进行更改。第二个上下文将使用相同的数据库。

我在不同的类库中创建了另一个数据库上下文(与此类似)。这工作正常,我可以独立于其他上下文进行查询和创建迁移。

但是例如,如果我在第一个上下文中有一个用户实体,在第二个上下文中有一个UserBooks,当我尝试在两个上下文之间join时,它不起作用,出现异常

System.ArgumentNullException:值不能为空。 参数名称:实体类型

这是一个已知问题。

还尝试使用最新的NuGet包3.0.0-preview3.19153.1,但唯一的区别是错误消息更好

不能在单个查询执行中使用多个 DbContext 实例。确保查询使用单个上下文实例

有什么办法可以

A. 在两个上下文之间建立联接

b. 在单独的项目中扩展上下文,而无需对"主"上下文进行任何(或最小)更改

两个数据库上下文意味着两个连接。您不能通过不同的连接加入。

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 });

你可以让你的第二个上下文继承第一个上下文。

public class MyFirstContext : DbContext
{
public DbSet<User> Users { get; set; }
}
public class MySecondContext : MyFirstContext
{
public DbSet<UserBook> UserBooks { get; set; }
}

当然,您的第二个上下文可能位于不同的程序集中。现在,您只需要在应用程序中MySecondContext。您将能够加入UsersUserBooks

相关内容

最新更新