Как заставить Effort работать с EntityFramework?

ОБЗОР
При использовании Fitnesse с EF6 не удается запустить приложение Effort. Я испробовал каждый трюк во всех сообщениях, которые смог найти.
Во всех сообщениях говорится либо вызвать «RegisterProvider», либо добавить раздел конфигурации. Ни один из них не работает.

На данный момент:
У меня есть "Effort.Provider" в разделе DbProviderFactories в файле machine.config. У меня появляется Effort.Provider, когда я смотрю на DbProviderFactories.GetFactoryClasses(); ProcMon показывает, что он ищет и находит Effort.dll.

Результат:
Любой из

DbConnectionFactory.CreateTransient();   
Effort.EntityConnectionFactory.CreateTransient(connectionString);   
DbProviderFactory dataFactory = DbProviderFactories.GetFactory(dt.Rows[5]);   

бросать

Effort.Exceptions.EffortException: The Effort library failed to register

Также попробовал:
"Effort.Provider" в разделе entityFramework файла Runner.exe.config, но не смог заставить его работать. Просто произошел сбой приложения.
Удаление EF и Effort.EF6 и повторная установка. Нет видимого эффекта.
Вызов Effort.Provider.EffortProviderConfiguration.RegisterProvider(); из конструктора класса и различных мест запуска. Effort.Provider никогда не появлялся в DbProviderFactory.GetFactoryClasses();
Поскольку «Effort.Provider» находится в разделе DbProviderFactories в app.config, он отображается в GetFactoryClasses так же, как и machine.config.

Использование:
Windows 10
.Net 4.6
VS 2016
EF 6.1.2 (хотя написано, что установлена ​​версия 6.1.3, не знаю, что это значит)

Нужно ли мне регистрировать DLL или что-то в этом роде? В инструкции про это ничего.

Дополнительные сведения:
App.config

<configuration>
    <runtime>
        <loadFromRemoteSources enabled="true"/>
    </runtime>
    <system.data>
        <DbProviderFactories>
            <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory, Effort" />
        </DbProviderFactories>
    </system.data>
</configuration>

person BWhite    schedule 02.05.2016    source источник
comment
Я думал, что это может быть доступ к фабрике Effort, которая выглядит как Effort.Provider.EffortProviderFactory, и выдает исключение, но, похоже, это не так.   -  person BWhite    schedule 03.05.2016


Ответы (1)


Похоже, вам нужно зарегистрировать раздел конфигурации "entityFramework" в файле app.config.

<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>
   <providers>
      <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />
    </providers>
 </entityFramework>

Затем в своем коде создайте соединение Effort и передайте его в свой DbContext. Если у вас еще нет конструктора, который принимает объект типа System.Data.Common.DbConnection, создайте его.

System.Data.Common.DbConnection connection = DbConnectionFactory.CreateTransient();
var context = new MyContext(connection);

Я бы также рекомендовал установить connectionString в вашем app.config. Я полагаю, что вызов CreateTransient создает для вас соединение, но если в тестируемом коде есть код, создающий где-то другой dbContext, Effort обратится к app.config, чтобы получить эту информацию. Ниже приведен пример создания временной базы данных, чтобы все операции, выполненные в одном тесте, не влияли на другой тест.

<add name="DefaultConnection" connectionString="Data Source=in-process;IsTransient=true" providerName="Effort.Provider" />
person Bobby Erikson    schedule 13.05.2016
comment
Часть defaultConnection — единственная часть, которой у меня нет. Я попробую это. Я не слишком усердно смотрел в этом направлении, потому что предполагал, что это приведет к другой ошибке, а не к остановке создания класса. На самом деле я пишу в консоль в конструкторе. У меня есть все основания полагать, что это ошибка. Просто не может найти. Несмотря на то, что procmon показывает, что он читает библиотеку усилий. - person BWhite; 15.05.2016
comment
У меня такая же проблема, но этот ответ ее не решает. Любые другие идеи? - person Jess; 16.02.2017
comment
Единственное, о чем я могу думать, это убедиться, что у вас есть следующий раздел в качестве дочернего элемента элемента ‹configuration› в вашем app.config <system.data> <DbProviderFactories> <add name="Effort Provider" description="Effort in memory db provider" invariant="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" /> </DbProviderFactories> </system.data> Убедитесь, что инвариант соответствует invariantName в разделе поставщиков EF - person Bobby Erikson; 17.02.2017
comment
Спасибо за предоставление ключевой части головоломки, которую мне не хватало, Бобби - в оригинальной статье, описывающей, как получить эту работу, отсутствует строка подключения. - person mattpm; 24.08.2017