EF Core и несколько баз данных - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть устаревшая система с тремя базами данных

  1. Производитель
  2. CustomCode
  3. LogData

Vendor содержит данные управления и регистрации из нашего приложения Vendors.

CustomCode содержит множество представлений и хранимых процедур, которые присоединяются к Vendor и LogData

LogData содержит результаты наших процессов CustomCode. Например: Ежедневные / Еженедельные / Ежемесячные сводки и результаты.

Я пишу веб-сайт, который будет отображать данные на карте. Список единиц из представления в CustomCode. Сводная запись получена из LogData, а отдельные точки журнала извлекаются из поставщика сохраненным процессом в CustomCode.

Я начал с DbContext для CustomCode, но не могу перейти к свойствам во втором DbContext к LogData

Можно ли связать свойства навигации между объектами в разных контекстах?

Могу ли я иметь один раз контекст с несколькими подключенными базами данных?

Обратите внимание, это не имеет ничего общего с мультитенантной или мультисхемой.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Можно ли связать свойства навигации между объектами в разных контекстах?

номер

Могу ли я иметь один контекст с несколькими подключенными базами данных?

Количество

Предложение:

Если базы данных могут взаимодействовать друг с другом (например, на том же сервере ), что, по-видимому, уже сделано с

CustomCode содержит множество представлений и хранимых процедур, которые присоединяются к Vendor и LogData

затем создайте хранимую процедуру для выполнения желаемых запросов (, которая может объединять таблицы из отдельных баз данных ).

Оттуда вы сможете открывать и выполнять процедуру из Entity Framework для выполнения желаемой функциональности.

Это позволит избежать нескольких контекстов и попыток объединения данных в памяти, что может иметь неблагоприятные последствия, если набор данных большой.

0 голосов
/ 24 января 2019

Также ответили в другом месте (https://stackoverflow.com/a/54347237/861352),, но вот суть:

На самом деле это известная проблема, решение которой находится на стадии разработки (хотя она еще не расставлена ​​по приоритетам):

https://github.com/aspnet/EntityFrameworkCore/issues/4019

Однако я нашел временное решение этой проблемы, и оно основано на двух источниках:

https://stackoverflow.com/a/26922902/861352 (раствор EF6) https://weblogs.asp.net/ricardoperes/interception-in-entity-framework-core

И вот оно:


Как сделать (тот же сервер) кросс-DB соединения с одним ядром EF DbContext


Вам потребуется установить пакет Nuget для Microsoft.Extensions.DiagnosticAdapter

using System;
using System.Data.Common;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.DiagnosticAdapter;

namespace Example
{
    public class CommandInterceptor
    {
        [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting")]
        public void OnCommandExecuting(DbCommand command, DbCommandMethod executeMethod, Guid commandId, Guid connectionId, bool async, DateTimeOffset startTime)
        {
            var secondaryDatabaseName = "MyOtherDatabase";
            var schemaName = "dbo";
            var tableName = "Users";

            command.CommandText = command.CommandText.Replace($" [{tableName}]", $" [{schemaName}].[{tableName}]")
                                                     .Replace($" [{schemaName}].[{tableName}]", $" [{secondaryDatabaseName}].[{schemaName}].[{tableName}]");
        }
    }
}

Замените 'MyOtherDatabase', 'dbo' и 'Users' на имя вашей базы данных, схему таблицы и имя таблицы, возможно из конфигурации и т. Д.

Затем прикрепите этот перехватчик к вашему контексту.

using System.Diagnostics;
using Microsoft.EntityFrameworkCore.Infrastructure;


var context = new MultipleDatabasesExampleDbContext(optionsBuilder.Options);

// Add interceptor to switch between databases
var listener = context.GetService<DiagnosticSource>();
(listener as DiagnosticListener).SubscribeWithAdapter(new CommandInterceptor());

В моем случае я поместил вышеупомянутое в метод MultipleDatabasesExampleDbContextFactory.

Теперь вы можете просто использовать контекст, как если бы вы ссылались на одну базу данных.

context.Customers // Default database defined in connection string
context.Users     // MyOtherDatabase (a different database on the same server)
0 голосов
/ 04 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...