【发布时间】:2018-11-27 04:23:32
【问题描述】:
在实体框架中,可以通过这种方式检查表的存在:
bool exists = context.Database
.SqlQuery<int?>(@"
SELECT 1 FROM sys.tables AS T
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id
WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'")
.SingleOrDefault() != null;
我使用的是EF Core 2.1,方法SqlQuery不存在。
检查表是否存在的正确方法是什么?理想情况下,不要尝试访问该表并假设如果抛出异常它不存在。
编辑:我的最终实现
public bool TableExists(string tableName)
{
return TableExists("dbo", tableName);
}
public bool TableExists(string schema, string tableName)
{
var connection = Context.Database.GetDbConnection();
if (connection.State.Equals(ConnectionState.Closed))
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = @"
SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema
AND TABLE_NAME = @TableName";
var schemaParam = command.CreateParameter();
schemaParam.ParameterName = "@Schema";
schemaParam.Value = schema;
command.Parameters.Add(schemaParam);
var tableNameParam = command.CreateParameter();
tableNameParam.ParameterName = "@TableName";
tableNameParam.Value = tableName;
command.Parameters.Add(tableNameParam);
return command.ExecuteScalar() != null;
}
}
【问题讨论】:
-
你能扩展
is not valid吗? -
你试过
FromSql吗? -
这个问题是关于“开放查询”的一般问题,还是严格意义上的表存在检查?
-
@JohnB 该方法在 EF Core 中不存在。
标签: c# entity-framework entity-framework-core