SQLite封装程序1.0.77和.NET 4下的Entity Framework

3
我们正在开发一款基于.NET 4的Windows应用程序,它使用带有.NET包装器System.Data.SQLite和实体框架的SQLite数据库。在部署机器上,它需要.NET 4客户端配置文件。
SQLite包装器的最新官方版本(1.0.66)已经有2年之久了。这个版本适用于.NET 2.0 - 3.5,这意味着我们应该强制用户安装两个版本的.NET。此外,它不支持外键。
还有一个非官方版本1.0.77,它支持外键,但是在这个版本中ORM(.NET Entity Framework)的支持已经失效了(它会引发System.Data.ProviderIncompatibleException异常)。我可以看到三种解决这个问题的方法:
  1. 放弃使用这个包装器并寻找其他选项。你有什么建议?
  2. 放弃使用Entity Framework。这个选项不太好,因为它是老派的方法,而且需要我们重写很多代码,写更多的代码会增加出错的可能性。
  3. 尝试解决1.0.77的问题,但我不知道需要多长时间。在这种情况下,你会怎么做?我们应该看看哪些其他包装器?

1
除了以下情况之外,我也发生了所有设置的情况:*在构建64位配置时,我引用了32位的System.Data.SQLite.dll - Victor Sergienko
1个回答

3
最后,我明白了如何让 1.0.77 System.Data.SQLite 程序集与 Entity Framework 协同工作,并且可以不将程序集放置到 GAC 中。
我首次尝试连接 SQLite 1.0.77 后出现以下错误:

System.Data.ProviderIncompatibleException: 调用 'System.Data.SQLite.SQLiteFactory' 类型的存储提供程序实例上的 'GetService' 方法后返回了 null。存储提供程序可能无法正常工作。

代码分析表明主程序集 System.Data.SQLite.dll 找不到 System.Data.SQLite.Linq.dll。第二个程序集已被引用到项目中并存在于输出 bin 文件夹中。但是错误没有消失。 反编译器显示,System.Data.SQLite.Linq.dll 没有公共类。因此,它永远不会自动加载到应用程序域中,因为没有代码引用它。所以它必须只存在于 GAC 中才能正确工作。 但是,我们可以手动将其加载到应用程序域中!例如,在应用程序启动时:
Assembly.Load("System.Data.SQLite.Linq");

就是这样了!

另外,别忘了将以下行添加到您的应用程序配置文件中:

<system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite"
           description=".Net Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
    </DbProviderFactories>
  </system.data>

希望我的经验能够有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接