J'ai un système hérité avec trois bases de données
Vendor contient des données de contrôle et de journal de notre application Vendors.
CustomCode contient de nombreuses vues et procédures stockées qui se joignent à Vendor et LogData
LogData contient les résultats de nos processus CustomCode. Ex: résumés et résultats quotidiens/hebdomadaires/mensuels.
J'écris un site Web qui tracera des données sur une carte. La liste des unités provient d'une vue dans CustomCode. L'enregistrement récapitulatif provient de LogData et les points de journal individuels sont récupérés auprès du fournisseur par un processus stocké dans CustomCode.
J'ai commencé avec un DbContext pour CustomCode, mais je n'arrive pas à naviguer vers les propriétés dans un 2e DbContext vers LogData
Puis-je lier des propriétés de navigation entre des objets dans des contextes différents?
Puis-je avoir une fois le contexte avec plusieurs bases de données connectées?
Veuillez noter que cela n'a rien à voir avec le multi-locataire ou le multi-schéma
Puis-je lier des propriétés de navigation entre des objets dans des contextes différents?
Non.
Puis-je avoir un contexte avec plusieurs bases de données connectées?
Non.
Suggestion:
Si les bases de données peuvent communiquer entre elles (ie sur le même serveur), ce qui semble être déjà fait depuis
CustomCode contient de nombreuses vues et procédures stockées qui se joignent à Vendor et LogData
puis créez une procédure stockée pour effectuer les requêtes souhaitées (qui peut joindre des tables de bases de données distinctes).
De là, vous devriez être en mesure d'exposer et d'exécuter la procédure à partir d'Entity Framework pour exécuter la fonctionnalité souhaitée.
Cela éviterait d'avoir plusieurs contextes et d'essayer de joindre les données en mémoire, ce qui peut avoir des effets néfastes si l'ensemble de données est volumineux.
A également répondu ailleurs ( https://stackoverflow.com/a/54347237/861352 ), mais voici l'essentiel:
Cela semble en fait être un problème connu, avec une solution en cours (bien qu'elle n'ait pas encore été priorisée):
https://github.com/aspnet/EntityFrameworkCore/issues/4019
J'ai cependant trouvé une solution provisoire à ce problème, et elle est basée sur deux sources:
https://stackoverflow.com/a/26922902/861352 (solution EF6) https://weblogs.asp.net/ricardoperes/interception-in-entity-framework-core
Et le voici:
Comment faire (même serveur) Cross DB se joint à un EF Core DbContext
Vous devrez installer le package 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}]");
}
}
}
Remplacez "MyOtherDatabase", "dbo" et "Users" par votre nom de base de données, votre schéma de table et votre nom de table, peut-être à partir d'une configuration, etc.
Attachez ensuite cet intercepteur à votre contexte.
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());
Dans mon cas, j'ai mis ce qui précède dans la méthode MultipleDatabasesExampleDbContextFactory.
Maintenant, vous pouvez simplement utiliser le contexte comme si vous faisiez référence à une base de données.
context.Customers // Default database defined in connection string
context.Users // MyOtherDatabase (a different database on the same server)
Non, vous ne pouvez pas lier les propriétés de navigation entre des objets dans des contextes différents. Un contexte représente une connexion ou une base de données particulière. Vous pouvez essayer d'obtenir des données de plusieurs contextes (DB) et les joindre et utiliser en mémoire.