Для этого DbContext .NET Core с SQL Server не настроен поставщик базы данных. - PullRequest
0 голосов
/ 06 января 2019

Я бился головой об стену этим и гуглил безрезультатно.

Я только что начал новый проект ASP.NET Core MVC, я установил / обновил свои пакеты для этих двух до 2.2.0:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Я также настроил проект на .NET Core 2.2.0.

Я могу успешно добавить свои схемы таблиц с помощью этой команды в консоли диспетчера пакетов для создания базы данных, поэтому я знаю, что строка подключения в порядке / работает:

Scaffold-DbContext "SERVER=Server\Instance;DATABASE=Database;UID=user;PWD=password;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables Table1, Table2, Table3

Файл созданной модели, DatabaseDBContext.cs выглядит так:

public partial class DatabaseDBContext : DbContext
{
    public DatabaseDBContext()
    {
    }

    public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
        : base(options)
    {
    }
}

Это также содержит метод, который работает для извлечения моих данных скаффолдов, но не считается безопасным для производственного использования, поэтому я прокомментировал это:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;");
    }
}

Я добавил эту же строку подключения в файл appsettings.json:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "DBConnString": "SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;"
  }
}

Затем я добавил DbContext в файл startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DBConnString")));
}

Попытка добавить новый scaffolded контроллер для одной из таблиц выдает эту ошибку:

Нахождение генератора 'контроллера' ...
Запуск генератора «контроллера» ...
Попытка скомпилировать приложение в памяти.
Попытка выяснить метаданные EntityFramework для модели и DbContext: 'TableName'

Для этого DbContext не настроен поставщик базы данных. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext.

StackTrace:
в Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize (ISopviceProvider scopedProvider, IDbContextOptions contextOptions, контекст DbContext)
в Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider ()
в Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService [TService] (IInfrastructure 1 accessor)<br> at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func 1 factory)

Для этого DbContext не настроен поставщик базы данных. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или с помощью AddDbContext в поставщике службы приложений. Если используется AddDbContext, то также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его базовому конструктору для DbContext.

Кто-нибудь понял, что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 07 января 2019

У меня была такая же проблема, и она решила ее для меня (настройка UseSqlServer в OnConfiguring):

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
    if (!builder.IsConfigured)
    {
        string conn = this.IsProduction ? Const.ProductionConnectionString : Const.LocalDBConnectionString;

        builder.UseSqlServer(conn);
    }

    base.OnConfiguring(builder);
}
0 голосов
/ 07 января 2019

Так что я исправил, но это действительно окольным путем. Мой новый проект изначально был на старой версии ядра .net. Я обновил версию, но, должно быть, во время обновления что-то не понравилось. Я создал новый проект и запустил его на 2.2.0, затем он работал ...

Кодовая логика звучала выше. Еще нужны такие же пакеты:

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Startup.cs кажется совсем другим, поэтому, возможно, если кто-то еще увидит это, он может попробовать обновить код startup.cs:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DatabaseDBConnString")));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Пришлось добавить ссылку на startup.cs для этого:

using Microsoft.EntityFrameworkCore;

Это было необходимо для разрешения метода AddDbContext.

После этого леса теперь работают. Так что это исправлено, но мне потребовалось начать все сначала, чтобы это исправить.

0 голосов
/ 06 января 2019

Попробуйте добавить этот третий конструктор:

public DatabaseDBContext()
{
}

public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
    : base(options)
{
}

public DatabaseDBContext(DbContextOptions options)
    : base(options)
{
}

Затем добавьте в каждую точку останова, чтобы убедиться, какая из них действительно используется.

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