Я пытаюсь использовать EF Core в нашем веб-приложении ASP.Net MVC 5 с помощью Framework 4.6.1. Мы используем Ninject для внедрения зависимостей. Я вставляю контекст в слой DAL. Мне удалось выполнить один запрос, но контекст выдает следующее исключение при выполнении следующего запроса
Для этого DbContext не настроен поставщик базы данных. Поставщика можно настроить, переопределив метод DbContext.OnConfiguring или используя AddDbContext в поставщике службы приложения. Если используется AddDbContext, также убедитесь, что ваш тип DbContext принимает объект DbContextOptions в своем конструкторе и передает его в базовый конструктор для DbContext.
Я видел эту ошибку раньше, но я не совсем уверен, как она применима в моей ситуации. Что именно в моей настройке вызывает эту ошибку? Вот код:
Контроллер:
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);
}
Привязка контекста:
kernel.Bind<Context.ContextTenant>().ToSelf().InTransientScope()
.WithConstructorArgument("options",
new DbContextOptionsBuilder<Tables.ContextTenant>()
.UseSqlServer(ConfigurationManager.ConnectionStrings
[EnvironmentConsts.DbConnectionTenant].ConnectionString)
.Options);
Контекст:
public ContextTenant(DbContextOptions<Tables.ContextTenant> options) : base(options)
{}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
Модули 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()));
}
}
Классы DAL
Класс1:
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);
}
}
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));
}
}
Услуги:
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);
}
}
Изменить: вот еще немного кода с самого начала на случай, если это что-то повлияет:
[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
}
}
}