Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DbContext FromSql无法替换数据库名称_Sql_Asp.net Core_.net Core_Dbcontext_Entity Framework Core - Fatal编程技术网

DbContext FromSql无法替换数据库名称

DbContext FromSql无法替换数据库名称,sql,asp.net-core,.net-core,dbcontext,entity-framework-core,Sql,Asp.net Core,.net Core,Dbcontext,Entity Framework Core,我正在使用.NET核心应用程序查询一些数据。在我的应用程序中,我使用两种不同的上下文。由于LINQ/EF无法在两个上下文之间连接,因此我使用DbContext..FromSql: IQueryable<Articles> query = _contextA.Articles.FromSql<Articles>( @"SELECT a.*, ra.Barcode AS RequestedBarcode FROM dbo.Articles

我正在使用.NET核心应用程序查询一些数据。在我的应用程序中,我使用两种不同的上下文。由于LINQ/EF无法在两个上下文之间连接,因此我使用DbContext..FromSql:

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);
这个查询非常有效。现在,我想从其他上下文中动态替换我的Webservice数据库名称

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);
_contextB.Database.GetDbConnection.Database中的值是完全正确的值字符串。但查询仍然失败,并显示以下错误消息:

"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
“Nähe von.”中的Falsche语法。表示接近“”的语法错误

做错了什么

更新: 前面的例子是用Core1.1完成的。现在我已经更新到Core2.0

这很好:

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}");
这不起作用:

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}");

这似乎行不通。

由于问题还有待解决,我在SQL语句中直接使用了String.Format而不是变量名:

string sqlQuery = String.Format(
    @"SELECT    a.*, ra.Barcode AS RequestedBarcode
      FROM        dbo.Articles a
      INNER JOIN  {0}.dbo.RequestArticle ra
        ON  ra.ProducerId = a.ProducerId AND ra.Barcode = a.Barcode
      WHERE       ra.RequestId = '{1}'",
    _contextB.Database.GetDbConnection().Database,
    ArticleRequestGuid
    );
var query = _contextA.Articles.FromSql<Articles>(sqlQuery);

不知何故,第一种变体根本不起作用。似乎在这个问题上投入更多的精力是不值得的。

我想尝试两种方法。首先定义一个helpvariable并在其中捕获_contextB.Database.GetDbConnection.Database;然后在.FromSql语句中使用此帮助变量。如果这不起作用,我还会尝试将{1}和{0}的当前顺序更改为顺序{0}和{1}。我使用一个帮助变量作为数据库名称,{0}和{1}的顺序是相反的。我只是复制了第一个代码块,并手动将其更改为第二个代码块,以突出显示更改并缩短问题。您使用的是哪个版本的EF Core?1.0。并计划下周推出2.0。请在1:17:30左右观看视频中有关EF Core 2.0的片段。如果它不能同时使用两个参数而不是一个参数,他们就不会证明这一点。也许您应该在EF Core 2.0中重试。