2

Для целей тестирования интеграции я хотел бы вручную создать и открыть EntityConnection в установленной тестовой конфигурации. Это приводит к сбою со следующим исключением при вызове метода Open():Вручную открытие EntityConnection для базы данных SQLite вызывает ProviderIncompatibleException

System.Data.ProviderIncompatibleException: после вызова метода GetService на экземпляре поставщика хранилища типа «System.Data.SQLite» был вызван нуль. 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" 

The 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 для тестирования, я использую Entity Framework 6.1.1 и System.Data.SQLite 1.0.94.0.

Edit: Странная вещь, что открытие магазина подключение предоставленному подключения объекта вручную работает ...

+0

Вы пробовали: provider = System.Data.SQLite.EF6 в строке подключения EF? – ErikEJ

+0

Да, поскольку я не настроил поставщика с именем System.Data.SQLite.EF6 в моем app.config, я получаю исключение: System.ArgumentException: указанный поставщик магазина не может быть найден в конфигурации или недействителен , – Harry13

+0

Я думаю, что это проблема с конфигурацией или решением для платформы Entity Framework, которая не связана с SQLite, может быть, некоторые эксперты EF могут перепрыгнуть? – Harry13

ответ

1

я узнал, что я использовал EntityConnection от System.Data.Entity вместо EntityFramework сборка.