0

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

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

任何帮助,将不胜感激。

4

1 回答 1

1

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

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

这是我为解决方案找到的最佳摘要(非常感谢 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来打开和关闭连接。

于 2013-11-08T15:56:12.393 回答