我试图将我的实体框架和身份分离到另一个库中,但是当我使用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;
是未使用的命名空间。
答案 0 :(得分:2)
内存中的概念旨在模拟内存(RAM)中的数据库。迁移用于生成/更新数据库架构到连接的数据库。内存数据库不需要迁移。您可以直接启动应用程序并开始使用DBContext,而无需尝试添加迁移。
关于您对Microsoft.EntityFrameworkCore.InMemory
名称空间的困惑,您尚未编写任何使用Microsoft.EntityFrameworkCore.InMemory
名称空间的代码。请注意,并非NuGet包下的每个类都在名称空间下。为了方便起见,在UseInMemoryDatabase
名称空间内创建了Microsoft.EntityFrameworkCore
扩展功能。这样,您不必每次更改数据库时都添加using语句。