Контекст EntityFramework для нескольких проектов или объединение между двумя контекстами - PullRequest
1 голос
/ 29 марта 2019

У меня есть проект библиотеки классов, содержащий контекст EF Core db.Это часть фреймворка.

Я хочу расширить этот контекст, но без внесения изменений в проект фреймворка.Второй контекст будет использовать ту же базу данных.

Я создал другой контекст БД в другой библиотеке классов (что-то похожее на this ).Это работает нормально, я могу делать запросы и создавать миграции отдельно от другого контекста.

Но, например, если у меня есть сущность User в первом контексте и UserBooks во втором, когда я пытаюсь создать join между двумя контекстами это не работает, получая исключение

System.ArgumentNullException: значение не может быть нулевым.Имя параметра: entityType

Это известная проблема .

Также пробовал с последним пакетом NuGet 3.0.0-preview3.19153.1 , но единственное отличие состоит в том, что сообщение об ошибке лучше

Невозможно использовать несколько экземпляров DbContextв рамках одного запроса выполнения.Убедитесь, что в запросе используется единственный экземпляр контекста

. Есть ли способ

a.создавать соединения между двумя контекстами

или

b.расширить контекст в отдельном проекте, не внося (или минимально) изменений в основной контекст

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вы можете сделать так, чтобы ваш второй контекст наследовал первый.

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

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

Конечно, ваш второй контекст может быть в другой сборке.Теперь вам нужно только MySecondContext в вашем приложении.Вы сможете присоединиться к Users и UserBooks.

0 голосов
/ 29 марта 2019

Два дБ-контекста означают два соединения. Вы не можете присоединиться через разные соединения.

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 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...