【问题标题】:EF Core SQLite checking if table existsEF Core SQLite 检查表是否存在
【发布时间】:2021-10-06 15:21:40
【问题描述】:

我正在尝试通过使用EF Core 3.1 RelationalDatabaseFacadeExtensions.ExecuteSqlRaw Method 执行查询来检查 SQLite 数据库中是否存在表

 var sql = $"SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = '{GetTableName(table)}';";
 var result = Database.ExecuteSqlRaw(sql) ;

结果总是返回

result = -1

这是规范化的查询

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

问题是,为什么Database.ExecuteSqlRaw(sql) 的结果会返回-1

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

当在 DB Browser for SQLite 中运行相同的查询时,查询工作得非常好:

【问题讨论】:

    标签: c# sqlite .net-core entity-framework-core ef-core-3.1


    【解决方案1】:

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

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

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

    创建一个新类

    [NotMapped]
    public class SpResult
    {
    public TableCount int {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;
    

    【讨论】:

    • 谢谢。这就是我开始的想法,但即使是文档中的示例也使用 select 语句。
    • 有没有办法执行select语句?
    • 谢谢,这有助于我刚刚阅读有关创建自定义实体类型的内容。感谢帮助
    • 如果您有任何问题,请告诉我。我用 .FromSqlRaw 做了很多工作
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2023-04-02
    • 2013-09-26
    相关资源
    最近更新 更多