多个项目间的EntityFramework上下文或两个上下文间的连接问题

3
我有一个包含EF Core db上下文的类库项目,这是框架的一部分。
我想扩展这个上下文,但不想更改框架项目。第二个上下文将使用相同的数据库。
我在另一个类库中创建了另一个db上下文(类似于this)。这可以正常工作,我可以单独进行查询和创建迁移。
但例如,如果我在第一个上下文中有一个User实体和第二个上下文中的UserBooks,则尝试在两个上下文之间进行join时它不起作用,会出现异常
System.ArgumentNullException: Value cannot be null. Parameter name: entityType 这是一个已知的问题
也尝试使用最新的NuGet软件包3.0.0-preview3.19153.1,但唯一的区别是错误消息更好。
无法在单个查询执行中使用多个DbContext实例。确保查询使用单个上下文实例。
有没有办法:
a. 在两个上下文之间进行连接
或者
b. 扩展一个单独的项目中的上下文,而不对“主”上下文进行任何(或最小)更改
2个回答

2

两个db-context意味着两个连接。你无法通过不同的连接进行联接。

1. 将数据加载到程序中

您可以将数据加载到程序中并在那里进行联接。请注意,在大型数据集上执行此操作可能存在风险。

注:原回答为"Original Answer"

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. 扩展您现有的上下文

如果您想坚持使用一个连接,您可以简单地扩展您的上下文。请注意,这种方式下您将处于一个事务中。

注:Original Answer 翻译成“最初的回答”。
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
我知道,但我需要从数据库中检索所有数据,然后在“客户端”上进行连接。我希望连接可以在单个查询中在数据库上完成。 - SzilardD
这对于小型数据集可能还可以,但绝不是推荐的方法。 - Knelis
如果只有一个数据库和一个连接可以使用,显而易见的解决方案是扩展上下文。添加了第二个解决方案。 - kara

1
你可以让第二个上下文继承第一个。
public class MyFirstContext : DbContext
{
    public DbSet<User> Users { get; set; }
}

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

当然,你的第二个上下文可能在不同的程序集中。现在你只需要在应用程序中使用 MySecondContext。你将能够连接 UsersUserBooks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接