我看过以下线程:How to pass parameters to the DbContext.Database.ExecuteSqlCommand method?
我觉得EF Core阻止我使用对Azure Sql数据库中的truncate
表进行参数化查询。
我尝试过:
var tableName = csvEntity.FileName.Replace(".csv", string.Empty);
var tableNameParam = new SqlParameter("@TableName", tableName);
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);
并且:
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);
并且:
await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");
并且:
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);
但是所有都会导致以下变化:
错误:“ @ TableName”附近的语法不正确。
但(如果我运行)
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE AllStarFull");
我们都很好!
在ExecuteSqlCommandAsync的截断语句中不能使用变量作为表名吗?
一些屏幕截图:
例外:
第三次在异常发生前尝试
第三次尝试异常
答案 0 :(得分:3)
您的第一次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);
不起作用,因为不能将表名作为参数传递给SQL语句。
您第二次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);
不起作用,因为替换{0}
需要您使用string.Format
您的第三次尝试
await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");
不起作用,因为Entity Framework需要使用常量字符串作为原始SQL。
您的第四次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);
不起作用,因为ExecuteSqlCommandAsync
无法正确映射参数。
为解决此问题,我们可以使用您的第三次尝试,如下所示。
var sqlQuery = $"TRUNCATE TABLE {tableName}";
await DbContext.Database.ExecuteSqlCommandAsync(sqlQuery);
这可以确保在将查询传递给Entity Framework时,它确切知道需要什么。