Effort + Autofac: не вернул объект, который наследуется от DbProviderServices - PullRequest
0 голосов
/ 29 сентября 2018

Я использую Effort, Effort.EF6 в качестве базы данных In-Memory для тестирования моего Web API 2 приложения.

Я использую Autofac для разрешения DI.

Это мой код в Startup.cs

builder.Register(c =>
                {
                    var dbConnectionFactory =
                        Effort.DbConnectionFactory.CreatePersistent(nameof(CvManagementDbContext));
                    return new CvManagementDbContext(dbConnectionFactory);
                })
                .As<DbContext>()
                .SingleInstance();

И в моем CvManagementDbContext.cs:

public CvManagementDbContext(DbConnection connection)
            : base(connection, true)
        {
        }

[ОБНОВЛЕНИЕ]

Это мой package.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ApiMultipartFormDataFormatter" version="1.0.3" targetFramework="net452" />
  <package id="Autofac" version="4.8.1" targetFramework="net46" />
  <package id="Autofac.WebApi2" version="4.2.0" targetFramework="net46" />
  <package id="AutoMapper" version="7.0.1" targetFramework="net46" />
  <package id="AutoMapper.EF6" version="1.1.1" targetFramework="net46" />
  <package id="DelegateDecompiler" version="0.24.0" targetFramework="net46" />
  <package id="DelegateDecompiler.EntityFramework" version="0.24.0" targetFramework="net46" />
  <package id="Effort" version="1.3.10" targetFramework="net46" />
  <package id="Effort.EF6" version="1.3.10" targetFramework="net46" />
  <package id="EntityFramework" version="6.2.0" targetFramework="net46" />
  <package id="JWT" version="4.0.0" targetFramework="net46" />
  <package id="Microsoft.AspNet.Cors" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Cors" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.6" targetFramework="net46" />
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.1" targetFramework="net46" />
  <package id="Microsoft.Net.Compilers" version="2.9.0" targetFramework="net46" developmentDependency="true" />
  <package id="Microsoft.Owin" version="4.0.0" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="4.0.0" targetFramework="net46" />
  <package id="Mono.Reflection" version="1.1.0.0" targetFramework="net46" />
  <package id="Mono.Reflection.Core" version="1.1.1" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="11.0.2" targetFramework="net46" />
  <package id="NMemory" version="2.0.4" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="ServiceStack.Common" version="5.4.0" targetFramework="net46" />
  <package id="ServiceStack.Interfaces" version="5.4.0" targetFramework="net46" />
  <package id="ServiceStack.Redis" version="5.4.0" targetFramework="net46" />
  <package id="ServiceStack.Text" version="5.4.0" targetFramework="net46" />
  <package id="System.Buffers" version="4.5.0" targetFramework="net46" />
  <package id="System.Memory" version="4.5.1" targetFramework="net46" />
  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.1" targetFramework="net46" />
  <package id="System.ValueTuple" version="4.5.0" targetFramework="net46" />
</packages>

Конфигурация Effort в Web.config

<entityFramework>
    <interceptors>
      <interceptor type="Cv_Management.Interceptor.GlobalDbCommandInterceptor, Cv_Management" />
    </interceptors>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
      <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices,Effort" />
    </providers>
  </entityFramework>

Когда мое приложение запускает исключение, генерируемое в консоли:

'Элемент' Instance 'типа поставщика Entity Framework' Effort.Provider.EffortProviderServices, Effort, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 6a46696d54971e6d 'не возвращал объект, который наследуетот 'System.Data.Entity.Core.Common.DbProviderServices'.Поставщики Entity Framework должны наследовать от этого класса, а член 'Instance' должен возвращать одноэлементный экземпляр поставщика.Это может быть связано с тем, что поставщик не поддерживает Entity Framework 6 или более позднюю версию;см. http://go.microsoft.com/fwlink/?LinkId=260882 для получения дополнительной информации. '

Что я не так делаю?

1 Ответ

0 голосов
/ 02 октября 2018

Я думаю, мне удалось воспроизвести вашу проблему.Вы видите, Effort и Effort.EF6 являются взаимоисключающими библиотеками, вы только одна из них.Согласно Effort github :

Если вы используете Entity Framework 6 ...

  • Вам понадобится Усилие.Пакет EF6
  • Проверьте официальный сайт NuGet

в противном случае ...

  • Вам потребуется пакет Effort
  • Проверьте официальный сайт NuGet

Я получил вашу ошибку, когда у меня есть ссылка на dll из Effort пакета в моем файле csproj:

<Reference Include="Effort, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6a46696d54971e6d, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\Effort.1.3.10\lib\net45\Effort.dll</HintPath>
</Reference>

ошибка исчезла, когда я изменил ссылку на dll из пакета Effort.EF6:

<Reference Include="Effort, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6a46696d54971e6d, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\Effort.EF6.1.3.10\lib\net45\Effort.dll</HintPath>
</Reference>

Проверьте ссылки в файле csproj, убедитесь, что вы используете dll из Effort.EF6.И избавиться от Effort пакета.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...