J'utilise mon application .NET Core pour interroger certaines données. Dans ma demande, j'utilise deux contextes différents. Comme LINQ/EF ne sont pas en mesure de se joindre entre deux contextes, je fais ma requête avec DbContext..FromSql:DbContext-FromSql ne peut pas remplacer le nom de base de données
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN Webservice.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {0}",
ArticleRequestGuid);
Cette requête fonctionne comme un charme. Maintenant, je veux remplacer mon "Webservice" -database-nom dynamiquement de mon autre contexte.
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN {1}.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {0}",
ArticleRequestGuid,
_contextB.Database.GetDbConnection().Database);
La valeur _contextB.Database.GetDbConnection(). Base de données est la valeur exacte chaîne correcte. Mais la requête échoue toujours avec message d'erreur suivant:
"message": "Falsche Syntax in der Nähe von '.'.",
"detail": "
at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__107_0(Task`1 result)\r\n
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()\r\n
at System.Threading.Tasks.Task.Execute()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
" '' Falsche Syntaxe in der von Nähe." signifie "Mauvaise syntaxe proche de '.'."
Qu'est-ce qui est mal fait?
Mise à jour: L'exemple avant a été fait avec Core 1.1. Maintenant, j'ai mis à jour vers Core 2.0.
Cela fonctionne très bien:
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN Webservice.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {ArticleRequestGuid}");
Ce ne fonctionne pas:
string webserviceDatabaseName = "Webservice";
IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>(
@"SELECT a.*, ra.Barcode AS RequestedBarcode
FROM dbo.Articles a
INNER JOIN {webserviceDatabaseName}.dbo.RequestArticle ra
ON ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
WHERE ra.RequestId = {ArticleRequestGuid}");
On dirait que cela ne fonctionnera pas.
Je voudrais essayer deux choses. Commencez par définir une variable d'aide et récupérez "_contextB.Database.GetDbConnection(). Database" dans le fichier; puis utilisez cette variable d'aide dans l'instruction .FromSql <>(). Si cela ne fonctionne pas, j'essaierais aussi de changer l'ordre actuel de {1} et {0} dans l'ordre séquentiel {0} et {1}. – JRB
J'utilise une variable d'aide pour le nom de la base de données et l'ordre séquentiel de {0} et {1} est l'inverse. J'ai simplement copié le premier bloc de code et l'ai modifié manuellement pour le second bloc de code afin de mettre en évidence les changements et de raccourcir la question. – Stix
Quelle version de EF Core utilisez-vous? – JRB