Entity Framework Core - несколько баз данных DbContext - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть приложение wpf + EF Core 2 для доступа к данным (несколько таблиц в дБ). Программное обеспечение планируется в 2 или 3 разных «версиях» (в зависимости от бизнеса, но будет использовать одни и те же БД и «тот же интерфейс "с различными взглядами)Сегодня DbContext содержит много таблиц (чтобы охватить все версии), и я хочу разделить эту таблицу на маленькие Dbcontext(s)

Так каков наилучший подход?У меня будет DI /IOC для разрешения CurrentContext (возврат DBVersion1 или DBVersion2 или DBVersion3 в зависимости от типа версии (установленной пользователем при запуске пользовательского интерфейса). Является ли приведенный ниже код хорошим подходом?

public class DBVersion1 : DbContext
{
    public DbSet<Blog> Blogs { get; set; }  
    public DbSet<Post> Posts { get; set; }
    public DBSet<User>{ get; set; }
    public DBSet<Books> { get; set; }
    public DBSet<Engine> { get; set; }
}

public class DBVersion2 : DbContext
{
    public DbSet<Blog> Blogs { get; set; }  
    public DbSet<Post> Posts { get; set; }
    public DBSet<User>{ get; set; }
    public DBSet<Books> { get; set; }
    public DBSet<Engine> { get; set; }
    public DBSet<Paiement>{ get; set; }
    public DBSet<Invoice> { get; set; }
}

public class DBVersion3 : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

public static DbContext CurrentContext
{
    get
    {
    var _servicesCollection = new ServiceCollection().                    
    AddDbContext<DBVersion1 >(options => options.UseSqlServer(@"Server=
 (localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"))
    .AddDbContext<DBVersion2 >(options => options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"))
    .AddDbContext<DBVersion3>(options => options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"))
    .BuildServiceProvider();

    return _mainContext ?? (_mainContext = _servicesCollection.GetService<DBVersion1>());  
            }
        }
  • Как я могу переключиться между Dbcontext1/2/3 в CurrentContext getter?
  • Рефакторинг фактического может быть трудным? Т.е. сегодня у модели представления может быть var v = DBContext.Paiement.... et

после: var v = CurrentContext.Paiement? => Не компилируется в случае Version1? (Или, может быть, в этом нет смысла?)

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

"Я хочу разделить это на малые и многие Dbcontext (s)"

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

Ваш контекст БД представляет базу данных.Вся база данных, а не ее часть.Если вы разделите это, вы, скорее всего, столкнетесь с серьезными проблемами.Например, вы обновляете что-то с помощью версии 1 контекста, в то время как версия 2 контекста все еще имеет старые данные, кэшированные для работы.

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

Итак, главный вопрос: зачем вам это делать?Каковы преимущества?И стоит ли, если вы посмотрите на риски?

На мой взгляд, лучшим решением было бы иметь контекст в 1 БД и разделить его на уровень, например,в доменном слое (ограниченный контекст).Тогда у вас есть логическое разделение вместо физического, что имеет больше смысла.

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

Надеюсь, это поможет вам.

0 голосов
/ 25 апреля 2018

Вы можете использовать частичный класс для своего YourDbContext(DbContext) класса. Частичный класс Вы можете использовать один класс YourDbContext(DbContext), но они будут частично реализованы с другим файлом, и, наконец, вы можете разрешить этот DI / IOC DbContextin.И в вашем шаблоне репозитория вы можете вызывать только YourDbContext(DbContext), не нужно многократного DbContext, иначе это нарушит принципы разработки / стандарт кода.

DBVersion1.cs File

public partial class YourDbContext{
     public DbSet<Blog> Blogs { get; set; }  
     public DbSet<Post> Posts { get; set; }
     public DBSet<User>{ get; set; }
     public DBSet<Books> { get; set; }
     public DBSet<Engine> { get; set; }
}

Файл DBVersion2.cs

public partial class YourDbContext{
     public DbSet<Blog> Blogs { get; set; }  
     public DbSet<Post> Posts { get; set; }
     public DBSet<User>{ get; set; }
     public DBSet<Books> { get; set; }
     public DBSet<Engine> { get; set; }
     public DBSet<Paiement>{ get; set; }
     public DBSet<Invoice> { get; set; }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<YourDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("Cn")));
}

И вы можете видеть мой s tackoverflow ответ , как настроить EFcore в asp.ner core 2

...