EF Core SQLite 检查 table 是否存在

EF Core SQLite checking if table exists

我正在尝试通过使用 EF Core 3.1 RelationalDatabaseFacadeExtensions.ExecuteSqlRaw Method

执行查询来检查 SQLite 数据库中是否存在 table
 var sql = $"SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = '{GetTableName(table)}';";
 var result = Database.ExecuteSqlRaw(sql) ;

结果总是returns

result = -1

这是规范化的查询

SELECT COUNT(*) 
FROM sqlite_master 
WHERE type = 'table' AND name = 'SendRequest';

问题是,为什么 Database.ExecuteSqlRaw(sql) return -1 的结果?

我在文档中看不到这意味着什么。我觉得它在抛出一个错误,但我还没有找到任何文件来证明或反驳这个想法。

当同一查询在 DB Browser for SQLite 中 运行 时,查询工作得很好:

Database.ExecuteSqlRaw returns UPDATE、INSERT 和 DELETE 查询受影响的行数。对于 SELECT,它总是 returns -1。该方法不用于 returning 实体。

如果您想使用 dbcontexe 获取一些数据,您可以创建带有输出参数的存储过程,该过程将 return 计数。

另一种方法是创建未映射的数据集,它将获取 return 数据并使用 FromSqlRaw 进行 运行 查询。

新建一个class

[NotMapped]
public class SpResult
{
public int TableCount {get; set;}
}

将新的数据库集添加到 dbcontext

  public virtual DbSet<SpResult> SpResults{ get; set; }

并查询

var sql = $"SELECT COUNT(*) AS TableCount FROM sqlite_master WHERE type = 'table' AND name = '{GetTableName(table)}';";

var result = await _context.Set<SpResult>()
                 .FromSqlRaw(sql)
                .ToArrayAsync();

var tableCount=result.FirstOrDefault().TableCount;