我们有一个x86位winforms应用程序,它是.Net 4.0并使用EF 6.2 和SQLite 1.0.108.0。
应用程序在大多数计算机上的某些机器上运行良好,当查询sqlite db文件中的任何表时,它会永久挂起。
我们能够创建上下文,但是在调用第一个查询后,它就挂了。
此外,呼叫GC.WaitForPendingFinalizers()
也将永远挂起。
还值得一提的是,使用System.Data.SQLite.SQLiteConnection
和System.Data.SQLite.SQLiteCommand
很好用。
之前没有通过EF上下文对db的调用,因此不应存在任何仍未释放的与DB的持久连接。
我的上下文类是:
public class MyClientContext : DbContext
{
static MyClientContext ()
{
Database.SetInitializer<MyClientContext >(new
CreateDatabaseIfNotExists<MyClientContext >());
Database.DefaultConnectionFactory = new EncryptedConnectionFactory();
}
public eReceiptPosClientContext(string connectionString)
: base(Database.DefaultConnectionFactory.CreateConnection(connectionString), true)
{
}
// DBsets here
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Mappings here
}
}
App.Config中的EF和SQLite配置:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description="Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
更新:
我现在确定这与处置存储库对象有关。我认为将对象处置称为实际上并没有处置任何东西。
这就是为什么调用GC.WaitForPendingFinalizers()挂起的原因。
下面是我创建和使用存储库的方法:
using (var repo = new SettingsRepository(dbConnString))
{
repo.GetValue(HasValidReceiptsKey);
}
在GetValue()
内:
return _db.Settings.Where(k => k.Key == key).FirstOrDefault();
真的是处置不起作用吗?
或者我错过了什么。
任何帮助将不胜感激。
谢谢
Mousa Shawar