Sto provando a generare la migrazione nella libreria di classi EF Core ma fino ad ora inutilmente. Sto usando la console di Gestione pacchetti (Comunità di Visual Studio 2017) per scrivere un comando come questo:
PM> Add-Migration Update37
ma ottengo sempre un errore:
Impossibile creare un oggetto di tipo "DBContext". Aggiungere un'implementazione di "IDesignTimeDbContextFactory" al progetto o consultare https://go.microsoft.com/fwlink/?linkid=851728 per ulteriori modelli supportati in fase di progettazione.
La mia struttura della soluzione:
Come puoi vedere, ho 2 progetti in cui MesDBModels è una libreria di classi per cui vorrei generare la migrazione alla cartella Migrations. Ho aggiunto un DummyProject
per fornire "Progetto di avvio" su runtime .NETcore. DummyProject
contiene anche implementazioni dell'interfaccia IDesignTimeDBContextFactory<>
nella classe DBContextFactory
. Anche DummyProject
contiene riferimenti al progetto 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 classe:
using System;
namespace DummyProject
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Quindi la mia domanda è: cosa sto sbagliando? Ho provato a mettere la classe DBContextFactory
nel progetto MesDBModels
insieme alla classe DBContext
ma il risultato è lo stesso. Ho seguito questo: Usando le migrazioni Entity Framework Core per il progetto di libreria di classi e questo: https://garywoodfine.com/using-ef-core-in-a-separate-class-library-project/ ma maby ho frainteso qualcosa o fatto Qualcosa non va.
Per favore aiuto.
Hai fatto un refuso nel tuo
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);
}
}
Quando si tenta di costruire DBContext
, il framework cerca IDesignTimeDbContextFactory
per DBContext
, ma si sta invece implementando una factory per il DbContext
base. Modificare DbContext
in DBContext
in questo codice e dovrebbe funzionare.