权利框架:单个模型上的单个应用程序中的多个数据库提供程序

时间:2015-09-28 12:41:26

标签: entity-framework sqlite entity-framework-6 system.data.sqlite

我目前正在开发一个围绕连接到MSSQL的EF4构建的应用程序。 现在我们决定,我们也应该能够连接到SQLite。

我已将应用程序升级到EF6,确保所有内容都按预期与MSSQL一起运行,并且现在正尝试将应用程序连接到SQLite DB(这是我们的mssql db的转换版本)。

可悲的是,我在这里遇到了一堵墙。

如果我尝试以与MSSQL相同的方式创建SQLite连接

            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = "System.Data.SQLite.EF6";
            entityBuilder.ProviderConnectionString = "data source=sqlite_master.db";
            entityBuilder.Metadata = @"res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl";                                
            connection = new EntityConnection(entityBuilder.ToString());
            connection.Open();

            theEntities = new masterEntities(connection); // masterEntities extends System.Data.Entity.DbContext
            getDataBaseVersion();

我得到一个异常,指出“System.Data.SQLite.SQLiteConnection”无法在getDataBaseVersion方法(这是第一个对实体运行查询的方法)中转换为“System.Data.SqlClient.SqlConnection”。

我已经尝试了一些东西,但总是得到这个或“非预期的代码优先异常”。

顺便说一下:我真的不需要在运行时为SQLite版本创建连接字符串。如果可以使用配置文件解决问题,我很乐意这样做。

我的app.config看起来像这样:

  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SQLite" 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"/>
      <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>

我的猜测是,在实体数据模型中的某个地方,data.sqlclient类被设置为使用。但我无法创建第二个实体数据模型,因为所有类和属性都将被定义两次。 (我也不能因为sqlite数据源不会出现在实体数据模型的辅助中,但我希望能够通过重新安装所有内容来解决这个问题)

现在我想知道:是否可以在同一个应用程序中为同一个模型使用两个不同的提供程序? 如果是的话,如果有人能指出我的解决办法让它发挥作用,我会很高兴。

更新 我想我昨晚取得了一些进展:在app.config中的每个System.Data.SQLite中添加.EF6后,我现在得到了一个不同的例外。

app app现在看起来像这样:

  <entityFramework>
    <providers>
      <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" />
    </DbProviderFactories>
  </system.data>

我现在得到一个异常,说明找不到providerfactory“System.Data.SQLite.SQLiteFactory”的提供程序名称。

我还没有调查过,在一天中会这样做。

CNC中 我的项目目前引用(其中包括)

EntityFramework.dll // from nuget
EntityFramework.BulkInsert // from nuget
EntityFramework.MappingAPI // from nuget
EntityFramework.SqlServer // from nuget
System.Data
System.Data.DataSetExtensions
System.Data.Linq
System.Data.SQLite // from the sqlite-netFx451-setup-bundle-x86
System.Data.SQLite.EF6 // from the sqlite-netFx451-setup-bundle-x86

1 个答案:

答案 0 :(得分:0)

好的,我现在放弃了。 我现在已经创建了一个DB-First SQLite模型,当我尝试使用MSSQL Provider连接它时,我得到了相同的异常。

看起来我将不得不使用计划B并编译我们的应用程序的两个版本。一个用于sqlite,一个用于mssql。