【问题标题】: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来打开和关闭连接。