C# 为类库创建实体框架核心迁移

C# 为类库创建实体框架核心迁移,c#,.net-core,entity-framework-core,entity-framework-migrations,C#,.net Core,Entity Framework Core,Entity Framework Migrations,我试图在EF核心类库中生成迁移,但到目前为止没有任何效果。我正在使用PackageManager控制台(Visual Studio 2017社区)编写如下命令: PM> Add-Migration Update37 但我总是会出错: 无法创建“DBContext”类型的对象。将“IDesignTimeDbContextFactory”的实现添加到项目中,或参阅以获取设计时支持的其他模式 我的解决方案结构: 如您所见,我有两个项目,其中MesDBModels是类库,我想为其生成迁移到Mi

我试图在EF核心类库中生成迁移,但到目前为止没有任何效果。我正在使用PackageManager控制台(Visual Studio 2017社区)编写如下命令:

PM> Add-Migration Update37
但我总是会出错:

无法创建“DBContext”类型的对象。将“IDesignTimeDbContextFactory”的实现添加到项目中,或参阅以获取设计时支持的其他模式

我的解决方案结构:

如您所见,我有两个项目,其中MesDBModels是类库,我想为其生成迁移到Migrations文件夹。我添加了一个
DummyProject
,以便在.NETcore运行时上提供“启动项目”
DummyProject
还包含
DBContextFactory
类中的
IDesignTimeDBContextFactory
接口的实现。另外
DummyProject
包含对
MesDBModels
project的引用

MesDBModels.Database.DBContext:

using MesDBModels.FluentConfig;
using MesDBModels.Models;
using Microsoft.EntityFrameworkCore;

namespace MesDBModels.Database
{
public class DBContext : DbContext
{
    public DBContext(DbContextOptions<DBContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new AccessCardConfig());
        modelBuilder.ApplyConfiguration(new AlarmConfig());
        modelBuilder.ApplyConfiguration(new BitPositionConfig());
        modelBuilder.ApplyConfiguration(new MachineConfig());
        modelBuilder.ApplyConfiguration(new ParameterTemplateConfig());
        modelBuilder.ApplyConfiguration(new ReferenceConfig());
        modelBuilder.ApplyConfiguration(new ReferenceTemplateConfig());
        modelBuilder.ApplyConfiguration(new UserConfig());
        modelBuilder.ApplyConfiguration(new UserGroupConfig());
        modelBuilder.ApplyConfiguration(new UserPermissionConfig());

        base.OnModelCreating(modelBuilder);
    }

    public DbSet<AccessCard> AccessCards { get; set; }
    public DbSet<Alarm> Alarms { get; set; }
    public DbSet<AlarmDefinition> AlarmDefinitions { get; set; }
    public DbSet<AlarmPriority> AlarmPriorities { get; set; }
    public DbSet<BitPosition> BitPositions { get; set; }
    public DbSet<EventLog> EventLogs { get; set; }
    public DbSet<EventType> EventTypes { get; set; }
    public DbSet<Group> Groups { get; set; }
    public DbSet<Machine> Machines { get; set; }
    public DbSet<MachineState> MachineStates { get; set; }
    public DbSet<MachineStateDefinition> MachineStateDefinitions { get; set; }
    public DbSet<Permission> Permissions { get; set; }
    public DbSet<ParameterTemplate> ParameterTemplates { get; set; }
    public DbSet<ReferenceParameterHistory> ReferenceParameterHistory { get; set; }
    public DbSet<ParameterValueLimit> ParameterValueLimits { get; set; }
    public DbSet<Reference> References { get; set; }
    public DbSet<ReferenceParameterType> ReferenceParameterTypes { get; set; }
    public DbSet<ReferenceTemplate> ReferenceTemplates { get; set; }
    public DbSet<Session> Sessions { get; set; }
    public DbSet<Unit> Units { get; set; }
    public DbSet<UnitStatus> UnitStatuses { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<UserGroup> UserGroups { get; set; }
    public DbSet<UserPermission> UsersPermissions { get; set; }
}
所以我的问题是:我做错了什么?我尝试将
DBContextFactory
类与
DBContext
类一起放入
MesDBModels
项目中,但结果是一样的。 我遵循了这一点: 这是: 但可能是我误解了什么或做错了什么


请帮忙

您的文档中有一个输入错误

public class DBContextFactory : IDesignTimeDbContextFactory<DbContext>
{ 
    public DbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DbContext>();
        builder.UseSqlServer(
            "Server=(local)\\serverName;Database=dbName;Trusted_Connection=True;MultipleActiveResultSets=true");

        return new DbContext(builder.Options);
    }
}
公共类DBContextFactory:IDesignTimeDbContextFactory
{ 
public DbContext CreateDbContext(字符串[]args)
{
var builder=new DbContextOptionsBuilder();
builder.UseSqlServer(
“服务器=(本地)\\serverName;数据库=数据库名;可信连接=真;MultipleActiveResultSets=真”);
返回新的DbContext(builder.Options);
}
}

当尝试构造
DBContext
时,框架会为
DBContext
查找
IDesignTimeDbContextFactory
,但您将为基本
DBContext
实现一个工厂。在此代码中将
DbContext
修改为
DbContext
,它应该可以工作。

我建议在vs外部尝试,以确保在正确的(lib)项目中运行命令。只需打开PowerShell,转到LIB projects目录并运行dotnet ef migration add xy,看看会发生什么。(据我所知,如果在pm控制台上运行lib项目,您必须将其设置为启动项目)您正在实现
IDesignTimeDbContextFactory
还是
IDesignTimeDbContextFactory
?这些名字在视觉上非常接近,我不确定这是否是打字错误,但如果不是,那么很可能是问题的原因。这是正确的。简单的打字。。。迁移脚本是在我将
DbContext
更改为
DbContext
后生成的。谢谢
using System;

namespace DummyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
public class DBContextFactory : IDesignTimeDbContextFactory<DbContext>
{ 
    public DbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DbContext>();
        builder.UseSqlServer(
            "Server=(local)\\serverName;Database=dbName;Trusted_Connection=True;MultipleActiveResultSets=true");

        return new DbContext(builder.Options);
    }
}