Sto cercando di utilizzare EF Core nella nostra applicazione Web ASP.Net MVC 5 utilizzando Framework 4.6.1. Stiamo usando Ninject per l'iniezione di dipendenza. Sto iniettando il contesto nel livello DAL. Sono riuscito a eseguire una singola query ma il contesto genera la seguente eccezione quando viene eseguita la query successiva
Nessun provider di database è stato configurato per questo DbContext. Un provider può essere configurato eseguendo l'override del metodo DbContext.OnConfiguring o utilizzando AddDbContext sul provider del servizio dell'applicazione. Se si utilizza AddDbContext, assicurarsi inoltre che il tipo DbContext accetti un oggetto DbContextOptions nel suo costruttore e lo passi al costruttore di base per DbContext.
Ho visto questo errore prima, ma non sono sicuro di come si applica alla mia situazione. Di cosa si tratta la mia installazione che sta causando questo errore? Ecco un codice:
Il controller:
public ActionResult GetEnrollmentWorkflows()
{
var class1Entities = this._class1Service.GetAll().ToList();
var class1EntityIds = class1Entities.Select(x => x.Class1EntityId).ToList(); // Works
var class2Entity =
this._class2EntityService
.GetByClass1EntityIds(class1EntityIds).ToList(); // Fails with exception
return PartialView("_somePartial", model);
}
Il contesto vincolante:
kernel.Bind<Context.ContextTenant>().ToSelf().InTransientScope()
.WithConstructorArgument("options",
new DbContextOptionsBuilder<Tables.ContextTenant>()
.UseSqlServer(ConfigurationManager.ConnectionStrings
[EnvironmentConsts.DbConnectionTenant].ConnectionString)
.Options);
Il contesto:
public ContextTenant(DbContextOptions<Tables.ContextTenant> options) : base(options)
{}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
I moduli Ninject:
public class DalModule : NinjectModule
{
public override void Load()
{
this.Kernel.Bind(x =>
x.FromThisAssembly().SelectAllClasses().Join
.FromAssemblyContaining<ISomeInterface>()
.SelectAllInterfaces()
.BindAllInterfaces().Configure(y => y.InTransientScope()));
}
}
public class ServiceModule : NinjectModule
{
public override void Load()
{
this.Kernel?.Load(new[] { new DalModule() });
this.Kernel.Bind(x =>
x.FromThisAssembly().SelectAllClasses().Join
.FromAssemblyContaining<ISomeInterface>()
.SelectAllInterfaces()
.BindAllInterfaces().Configure(y => y.InTransientScope()));
}
}
Le classi DAL
Class1:
public class Class1Repository : IClass1Repository
{
private ContextTenant ContextTenant { get; }
public Class1Repository(ContextTenant contextTenant)
{
ContextTenant = contextTenant;
}
public IEnumerable<Class1Entity> GetAll()
{
return this.ContextTenant.Class1Entity.Select(x => x);
}
}
Classe 2:
public class Class2Repository : IClass2Repository
{
private readonly ContextTenant _contextTenant;
public Class2Repository(ContextTenant contextTenant)
{
_contextTenant = contextTenant;
}
public IEnumerable<Class2Entity> GetByClass1EntityIds(
IEnumerable<int> class1EntityIds)
{
return this._contextTenant.Class2Entity.Where(x =>
class1EntityIds.Contains(x.Class1EntityId));
}
}
I servizi:
public class Class1Service : IClass1Service
{
private readonly IClass1Repository _class1Repository;
public Class1Service(IClass1Repository class1Repository)
{
_class1Repository = class1Repository;
}
public IEnumerable<Class1Entity> GetAll()
{
return this._class1Repository.GetAll();
}
}
public class Class2Service : IClass2Service
{
private readonly IClass2Repository _class2Repository;
public Class2Service(IClass2Repository class2Repository)
{
_class2Repository = class2Repository;
}
public IEnumerable<Class2Entity> GetByClass1EntityIds(
IEnumerable<int> class1EntityIds)
{
return this._class2Repository.GetByClass1EntityIds(class1EntityIds);
}
}
Modifica: qui è un po 'più codice dall'inizio in caso ciò influirebbe su qualsiasi cosa:
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(NinjectWebCommon), "Stop")]
namespace MyApp
{
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
bootstrapper.ShutDown();
}
private static IKernel CreateKernel()
{
// Bind the context
}
}
}
Ho avuto problemi simili in passato che a volte potevano essere risolti cambiando
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
In
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (optionsBuilder.IsConfigured == false)
{
base.OnConfiguring(optionsBuilder);
}
}