Использование веб-приложения ASP.Net Core 2 для полного вызова библиотеки с помощью EF6

Я пытаюсь вызвать библиотеку доступа к данным .Net 4.7 (которая использует Entity Framework 6) из нового веб-приложения Asp Net Core 2.0.

Проблема в том, что EF6 не может заполучить DbProviderFactory. Моя рабочая теория заключается в том, что это должно быть предусмотрено в app/web.config вызывающей программы. Ошибка, которую я получаю:

System.TypeLoadException: «Не удалось загрузить тип System.Data.Common.DbProviderFactories из сборки System.Data, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089».

Чтобы обойти эту проблему, я создал класс DbConfiguration:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
    {
        SetProviderFactory("System.Data.SqlClient", System.Data.SqlClient.SqlClientFactory.Instance);
        SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);

    }
}

[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(string connectionString)
        : base(connectionString)
    {


    }

Точка останова показывает, что она правильно выполняет MyDbConfiguration, но все равно выдает ошибку. Я установил пакеты System.Data.SqlClient и System.Data.Common в веб-приложении .Net Core.

Я не нашел ничего, что явно говорило бы о том, что то, что я пытаюсь сделать (в общем), невозможно, поэтому я работаю исходя из предположения, что что-то не так с моей реализацией DBConfiguration. Пожалуйста, может кто-нибудь указать мне в правильном направлении?


person Paul Michaels    schedule 08.03.2018    source источник


Ответы (1)


Если вы хотите использовать библиотеку с Entity Framework из приложения .Net Core, вам следует перенацелить приложение на .Net Framework. Вот цитата из официального источника. :

Чтобы использовать Entity Framework 6, ваш проект должен быть скомпилирован для .NET Framework, поскольку Entity Framework 6 не поддерживает .NET Core. Если вам нужны кроссплатформенные функции, вам потребуется перейти на Entity Framework Core.

Если вы проверите образец проекта .Net .Core (ссылка из того же документа), которая использует библиотеку с EF6 (именно ваш случай), вы увидите, что она нацелена на .Net Framework, а не на .Net Core:

<TargetFramework>net452</TargetFramework>

Выполняя такой ретаргетинг, вы не потеряете какие-либо функции .Net Core, которые вы используете в настоящее время. Вы все еще можете использовать все те вкусные вещи, которые мы любим в .Net Core. Однако вы ограничиваете платформу, на которой ваше приложение может быть запущено, только .Net Framework. К сожалению, в настоящее время у вас нет обходного пути для этого ограничения, так как оно вызвано тем, что Entity Framework реализован только для .Net Framework. Вы можете либо перейти на Entity Framework Core, либо подождать, пока Entity Framework не станет частью стандарта .Net.

В общем, чтобы решить текущую проблему, измените следующую строку в файле .Net Core csproj:

<TargetFramework>netcoreapp2.0</TargetFramework>

to

<TargetFramework>net47</TargetFramework>
person CodeFuller    schedule 16.03.2018