使用UseInMemoryDatabase的实体框架核心迁移错误

时间:2019-01-12 02:58:37

标签: c# entity-framework asp.net-core

我试图将我的实体框架和身份分离到另一个库中,但是当我使用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 :(得分:2)

内存中的概念旨在模拟内存(RAM)中的数据库。迁移用于生成/更新数据库架构到连接的数据库。内存数据库不需要迁移。您可以直接启动应用程序并开始使用DBContext,而无需尝试添加迁移。

关于您对Microsoft.EntityFrameworkCore.InMemory名称空间的困惑,您尚未编写任何使用Microsoft.EntityFrameworkCore.InMemory名称空间的代码。请注意,并非NuGet包下的每个类都在名称空间下。为了方便起见,在UseInMemoryDatabase名称空间内创建了Microsoft.EntityFrameworkCore扩展功能。这样,您不必每次更改数据库时都添加using语句。