【问题标题】:SQLite temporary tables/triggers and Microsoft's Entity FrameworkSQLite 临时表/触发器和微软的实体框架
【发布时间】:2013-11-19 14:54:22
【问题描述】:

是否有人能够使用 Microsoft 的 Entity Framework 和 SQLite 创建临时表或触发器?我有一个可以创建永久表和触发器的工作应用程序,但不能创建临时表和触发器。列出 sqlite_temp_master 不会出现任何条目,并且任何与临时表交互的尝试都会失败,并出现“无表”错误。这些交互是通过单个 SQLiteConnection 进行的,尽管当时应用程序中至少有一个其他连接处于活动状态。

我正在使用 Database.ExecuteSqlCommand() 创建表和触发器。如果提供了 TEMPORARY 关键字,则没有错误,也没有表/触发器。如果未提供 TEMPORARY 关键字,则不会出现错误,并且会创建永久表/触发器。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# entity-framework sqlite triggers temp-tables


    【解决方案1】:

    System.Data.Entity.Database 对象在它认为合适的时候打开和关闭连接。在我使用 ExecuteSqlCommand 的方式中,它将打开和关闭每个命令的连接。所以临时表一被创建就会被丢弃。

    由于 DbContext 类中的一个明显问题,手动打开和关闭 Database.Connection 将不起作用。但是,内部的 ObjectContext 对象可以完成这项工作。

    Here's the best summary 我找到了解决方案(非常感谢 Brent McKendrick)

    (dbContext as IObjectContextAdapter).ObjectContext.Connection.Open();
    
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
        {
            // perform a list of queries
            // The connection will not close!
            scope.Complete();
            (dbContext as IObjectContextAdapter).ObjectContext.Connection.Close();
        }
    

    我将该技术与 SQLiteCommand 结合使用来创建一组临时表和触发器,执行我的操作,使用 LINQ 获取结果,然后结束事务并关闭连接。正如预期的那样,临时对象仅在最后被删除。

    在使用此技术时,我没有检查是否可以使用 Database.ExecuteSqlCommand 代替 SQLiteCommand。

    编辑:TransactionScope 不是必需的,而且肯定会增加任何操作的开销。关键部分是通过dbContext的ObjectContext来打开和关闭连接。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2020-08-16
      • 2013-04-13
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2015-04-20
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多