2

爲了集成測試的目的,我想手動創建並在測試夾具設置中打開一個EntityConnection。當調用Open()方法時,會出現以下異常:手動打開一個EntityConnection到SQLite數據庫導致ProviderIncompatibleException

System.Data.ProviderIncompatibleException:在對類型爲「System.Data.SQLite」的存儲提供程序實例調用「GetService」方法後返回null。 EF6.SQLiteProviderFactory」。商店提供商可能無法正常運作。

我使用的是同樣的連接字符串,當EF關心連接打開時,也使用這個連接字符串。如果我通過EF自動連接處理運行相同的測試套件,它就可以工作。

... 
[TestFixtureSetUp] 
public void FixtureSetUp() 
{ 
    // Setup database 
    // Setup data access 
    ... 
    var ec = new EntityConnection([ConnectionString]); 
    ec.StoreConnection.Open(); --> WORKS!! 
    ec.Open(); -> Throws 
} 
... 

連接字符串如下所示:

metadata=res://*/Test.TestModel.csdl|res://*/Test.TestModel.ssdl|res://*/Test.TestModel.msl;provider=System.Data.SQLite;provider connection string="data source=C:\Test\tmp4C80.tmp;read only=False;pooling=False;failifmissing=True;synchronous=Full;datetimekind=Utc;enlist=True;setdefaults=False;datetimeformat=ISO8601;journal mode=Off;cache size=4194304" 

在app.config爲NUnit的組件,我使用實體以下

<?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" /> 
    </configSections> 
    <entityFramework> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
     <providers> 
      <provider invariantName="System.Data.SqlClient" 
         type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
      <provider invariantName="System.Data.SQLite" 
         type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
     </providers> 
    </entityFramework> 
    <!-- Register protable database data providers --> 
    <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.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> 
     </DbProviderFactories> 
    </system.data> 
</configuration> 

除了NUnit的測試Framework 6.1.1和System.Data.SQLite 1.0.94.0。

編輯:奇怪的是,打開所提供的實體連接手動作品的存儲連接...

+0

您是否嘗試過:provider = System.Data.SQLite.EF6在EF連接字符串中? – ErikEJ 2014-10-01 15:24:28

+0

是的,因爲我沒有在我的app.config中配置名稱爲System.Data.SQLite.EF6的提供程序,所以我得到以下異常: System.ArgumentException:在配置中找不到指定的存儲提供程序,或者無效。 – Harry13 2014-10-02 06:53:26

+0

我認爲這是一個實體框架配置或程序集解決與SQLite無關的問題,也許一些EF專家可以跳入? – Harry13 2014-11-12 08:22:52

回答

1

我發現我用EntityConnectionSystem.Data.Entity的代替EntityFramework程序集。