我正在尝试使用SQLite将使用MS-SQL Server的EF3.5中的应用程序移植到EF6。目前,应用程序在我的开发机器上运行正常,但是一旦我尝试将其部署到其他地方(在本例中为我的Installation-Test-VM),它就不会加载。相反,我得到一个例外,说明具有不变名称'System.Data.SQLite'的ADO.NET提供程序和框架提供程序类型'System.Data.SQLite.EF6.SQLiteProviderServices,System.Data.SQLite.EF6'不能加载。
我在德语中得到例外,原始文本是
Der in der Anwendungskonfigurationsdatei für den ADO.NET-Anbieter mit dem invarianten Namen 'System.Data.SQLite' registrierte Entity Framework-Anbietertyp 'System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6' konnte nicht geladen werden.
当我从输出目录中删除SQLite DLL(System.Data.SQLite.dll和System.Data.SQLite.EF6.dll)时,我在开发机器上收到相同的消息。
我的配置文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="EntityFramework.MappingAPI" publicKeyToken="7ee2e825d201459e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.9" newVersion="6.0.0.9" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)"
invariant="System.Data.SQLite.EF6"
description=".NET Framework Data Provider for SQLite (Entity Framework 6)"
type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<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" />
</DbProviderFactories>
</system.data>
</configuration>
连接是在运行时构建的,如下所示:
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SQLite"; //I also tried System.Data.SQLite.EF6, same result
entityBuilder.ProviderConnectionString = new SqlConnectionStringBuilder()
{
DataSource = "sqlite_master.db" //The idea is that the user will later be able to choose which DB to open via a file chooser
}.ConnectionString;
entityBuilder.Metadata = @"res://*/OTDModel.csdl|res://*/OTDModel.ssdl|res://*/OTDModel.msl";
connection = new EntityConnection(entityBuilder.ToString()); //here the exception is thrown
connection.Open();
classThatExtendsDbContext dbContext = new classThatExtendsDbContext(connection);
两个DLL在Visual Studio中都设置了Local Copy = True和Specific Version = False。
我还尝试在sqlite-netFx451-binary-bundle-Win32-2013-1.0.99.0 paket上使用VM上的32位DLL(VM运行32位Win7,dev机器运行64位)。结果相同。
有谁知道这种行为可能是什么原因以及如何解决这个问题?
更新
我已经把一台从未与SQLite一起使用过的旧开发机器掉了下来,碰巧运行的是Windows 7 64Bit。应用程序启动没有任何问题。现在我正在设置64位虚拟机以查看我的问题是否仅限于32位计算机。
更新2
使用64位虚拟机也不起作用。与往常一样的错误。
答案 0 :(得分:0)
我现在设法解决了这个问题。
解决方案是从https://support.microsoft.com/kb/2019667
手动安装正确的Microsoft Visual C ++运行时库这对32位和64位VM都有帮助。我使用的是2013-x86版本,但我想你必须使用x64版本,如果你编译64位应用程序。