Также ответили в другом месте (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)