У меня есть ASP. NET Базовое приложение, которое структурировано в три уровня, а именно:
- Уровень доступа к данным (Entity Framework)
- Бизнес-логика c layer
- ASP. NET MVC веб-приложение
Как сейчас, конфигурация работает, и я могу получить доступ к своей базе данных в библиотеке своего веб-приложения , Однако, когда я сначала построил свой уровень доступа к данным с помощью EF Db, я получил обобщенный класс c, который выглядит примерно так:
public partial class ClassContext: DbContext
{
public ClassContext(DbContextOptions<ClassContext> options)
: base(options)
{
}
public virtual DbSet<Entity> Entity{ get; set; }
....
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("ConnString");
}
}
}
Как вы можете видеть, строка подключения жестко закодирована в моем OnConfiguring
метод, который не рекомендуется.
Поэтому я следовал следующему «руководству» здесь , которое предлагает мне использовать встроенный DI, чтобы передать строку подключения от моего Веб-библиотека.
Это я сделал:
public void ConfigureServices(IServiceCollection services)
{
//Add connectionstring to EF
services.AddDbContext<ClassContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ConnectionStringFromAppSettings")));
}
Согласно "руководству", строка соединения должна быть предоставлена конструктору моего ClassContext
класса - и это вроде как, но не с любым Строка подключения ..
Это означает, что optionsBuilder.IsConfigured
оценивает false и хочет использовать жестко закодированную строку подключения.
Поэтому я очень хотел бы знать, если я использую DI неправильно, так как я не могу получить доступ к строке подключения в моем ClassContext
классе
Обновлении
Я удалил метод OnConfiguring()
и теперь внедряю контекст в конструктор моего класса обслуживания в слое бизнес-логики c следующим образом:
public MasterService(ClassContext context)
{
MinorService = new MinorService(context);
}
public Stuff AddStuffIntoDatabase(Stuff test)
{
//business logic going before here
MinorService.addstuffMethod(test)
}
Однако теперь я получаю следующая ошибка, когда я хочу выполнить операцию в моей базе данных:
Для этого DbContext не настроен поставщик базы данных. Поставщик может быть настроен путем переопределения метода DbContext.OnConfiguring или использования AddDbContext в поставщике службы приложений.
Этого не происходило раньше, когда я неправильно настроил строку подключения в своем методе OnConfiguring()
.