c# - 使用 EF Core 2.1 检查表是否存在
问题描述
在实体框架中,可以通过以下方式检查表的存在:
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;
}
}
解决方案
context.Database.ExecuteSqlCommand("...")
但是,它仅限于返回一个整数,指示有多少行受到影响。如果您正在执行 a SELECT
,则不会影响任何行,因此它并不能真正满足您的需求。
还有FromSql
, 但这仅适用于表,而不适用于数据库级别:
context.TableName.FromSql("SELECT ...")
对于您正在做的事情,更好的选择是DbConnection
从 EF 获取,然后创建自己的DbCommand
. 这将返回您所期望的:
var conn = context.Database.GetDbConnection();
if (conn.State.Equals(ConnectionState.Closed)) await conn.OpenAsync();
using (var command = conn.CreateCommand()) {
command.CommandText = @"
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'";
var exists = await command.ExecuteScalarAsync() != null;
}
这里有一个警告:不要把DbConnection
你从GetDbConnection()
一个using
语句中得到,或者在你完成后关闭它。该连接用于该DbContext
实例的生命周期。因此,如果您关闭它,EF 稍后发出的任何请求都将失败。它也有可能在您的代码之前已经打开,这就是为什么我在那里进行测试以查看它是否在调用之前关闭OpenAsync()
。
推荐阅读
- python-3.x - 如何在python图像操作中消除类型转换中的值错误
- javascript - 某些提交的 Google Analytics 事件跟踪失败
- python - while 循环中的 for 循环 - For 循环不会遍历所有项目
- json.net - 如何从 json.net 中的 JProperty 获取 json 属性的值?
- javascript - 如何从组件调用 API 数据
- regex - 如何将模式转化为多个字段名称
- perl - 遍历数据库结果
- php - 在 EventSubscriber 中引发异常时停止数据库写入
- ruby-on-rails - Facebook v3.1 graph api Page Roles edge
- python - 如何使用 PIL 从列表中的值创建 RGB 图像?