Ошибка миграции основной структуры Entity Framework с использованием UseInMemoryDatabase - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь отделить Entity Framework и Identity от другой библиотеки, но не могу выполнить какие-либо миграции, когда использую builder.UseInMemoryDatabase(connectionString);.

Я могу выполнять миграцию, когда меняю его на builder.UseSqlServer(connectionString);, но мне нужно использовать UseInMemoryDatabase.

Вот ошибка при попытке добавить миграцию:

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

Код:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.InMemory;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;

namespace ClassLibrary1
{
    public class ApplicationUser : IdentityUser
    {
    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
            base.OnModelCreating(modelBuilder);
        }
    }

    public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContextFactory()
        {
        }

        public ApplicationDbContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseInMemoryDatabase(connectionString);

            return new ApplicationDbContext(builder.Options);
        }
    }
}

и это ссылка

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.2.1" />
</ItemGroup>

но using Microsoft.EntityFrameworkCore.InMemory; - это неиспользуемое пространство имен.

1 Ответ

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

Концепция in-memory предназначена для имитации вашей базы данных в вашей памяти (RAM). Миграции используются для генерации / обновления схемы базы данных для подключенной базы данных. База данных в памяти не нуждается в миграции. Вы можете напрямую запустить свое приложение и начать использовать DBContext, не пытаясь добавить миграции.

Что касается путаницы с пространством имен Microsoft.EntityFrameworkCore.InMemory, вы не написали ни одного кода, использующего пространство имен Microsoft.EntityFrameworkCore.InMemory. Обратите внимание, что не каждый класс в пакете NuGet находится под пространством имен. Для удобства функция расширения UseInMemoryDatabase создается в пространстве имен Microsoft.EntityFrameworkCore. Таким образом, вам не нужно добавлять оператор использования каждый раз, когда вы меняете свою базу данных.

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