Создание Entity Framework Core миграции для библиотеки классов - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь создать миграцию в библиотеке классов EF Core, но пока безрезультатно. Я использую Консоль диспетчера пакетов (сообщество Visual Studio 2017), чтобы написать команду, подобную этой:

PM> Add-Migration Update37

но я всегда получаю сообщение об ошибке:

Невозможно создать объект типа 'DBContext'. Добавьте реализацию IDesignTimeDbContextFactory в проект или посмотрите https://go.microsoft.com/fwlink/?linkid=851728 для дополнительных шаблонов, поддерживаемых во время разработки.

Моя структура решения:

enter image description here

Как вы видите, у меня есть 2 проекта, в которых MesDBModels - это библиотека классов, для которой я хотел бы создать миграцию в папку Migrations. Я добавил DummyProject, чтобы обеспечить "Startup project" в среде выполнения .NETcore. DummyProject также содержит реализации интерфейса IDesignTimeDBContextFactory<> в классе DBContextFactory. Также DummyProject содержит ссылку на MesDBModels проект.

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; }
}

}

DummyProject.DBContextFactory:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;

namespace 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);
    }
}

}

Класс DummyProject.Program:

using System;

namespace DummyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Итак, мой вопрос: что я делаю не так? Я попытался поместить класс DBContextFactory в проект MesDBModels вместе с классом DBContext, но результат тот же. Я следил за этим: Использование Entity Framework Core миграций для проекта библиотеки классов и это : https://garywoodfine.com/using-ef-core-in-a-separate-class-library-project/ но, может, я что-то неправильно понял или сделал что-то не так.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 08 сентября 2018

Вы сделали опечатку в вашем

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);
    }
}

Когда вы пытаетесь построить DBContext, фреймворк ищет IDesignTimeDbContextFactory для DBContext, но вы вместо этого реализуете фабрику для базы DbContext. Измените DbContext на DBContext в этом коде, и он должен работать.

...