У меня есть ситуация, когда мне нужно создать экземпляр моего DBContext после запуска моего решения.Я задал этот вопрос , в котором указано, что я могу сделать это с помощью аргумента конструктора .
. В качестве примера было предложено реализовать следующее:
var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlServer(connection);
using (var context = new BloggingContext(optionsBuilder.Options))
{
// do stuff
}
Однако я реализовал шаблон репозитория (в лучшую или худшую сторону) и, учитывая мои изменившиеся обстоятельства - не имея строки подключения до запуска запуска решения - мне нужно внедрить это в базовый класс репозитория, и я нахожусь внемного убытка ..
В настоящее время у меня есть это:
public class EntityBaseRepository<T> : IEntityBaseRepository<T> where T : class, IEntityBase, new()
{
public JobsLedgerAPIContext _context;
#region Properties
public EntityBaseRepository(JobsLedgerAPIContext context)
{
_context = context;
}
#endregion
public virtual IQueryable<T> GetAll()
{
return _context.Set<T>().AsQueryable();
}
public virtual int Count()
{
return _context.Set<T>().Count();
}
......
Как я могу реализовать это изменение и создать экземпляр DBContext в конструкторе (там, обходя необходимость добавить контекств качестве службы при запуске), а затем с переносом каждого из виртуальных методов в «использование» и т. д.
РЕДАКТИРОВАТЬ. Камило указал, что я не указал, когда у меня есть имя базы данных.
Основная ситуация заключается в том, что система запускается (это проект Aurelia SPA, который не имеет отношения к этой проблеме), отправляет пакет вбраузер, который показывает экран входа в систему.Пользователь входит в систему. Пользователь проверяется с помощью контроллера JWT. После проверки в контроллере (с использованием базы данных каталога, содержащей одну таблицу с 3 полями - имя пользователя, пароль, имя базы данных), я использую имя базы данных для создания строки подключения изатем создайте экземпляр моего DBContext в этот момент ... через конструктор.
Ответы ниже необходимо изменить, так как ответ с фабричным ответом (многообещающим) содержит ошибки, обнаруженные этим вопросом .. Нкоси ответил отличным ответом на ошибку.
РЕДАКТИРОВАТЬ 2 .. Это ответ на отредактированный вопрос ниже:
Вот мой оригинальный клиентский репозиторийwith: base (context) на конструкторе.
using JobsLedger.DATA.Abstract;
using JobsLedger.MODEL.Entities;
namespace JobsLedger.DATA.Repositories
{
public class ClientRepository : EntityBaseRepository<Client>, IClientRepository
{
private new JobsLedgerAPIContext _context;
public ClientRepository(JobsLedgerAPIContext context) : base(context)
{
_context = context;
}
public void RelatedSuburbEntities(Suburb _suburb)
{
_context.Entry(_suburb).Reference<State>(a => a.State).Load();
}
}
}
Имеет ссылку на базовый класс "context".Я не уверен, как изменить это, учитывая, что мне все еще нужно, чтобы ": base (context)" в конце.Кроме того, у меня есть метод, который также обращается к _context, который является частью конструктора ...
Далее я предполагаю, что больше не могу внедрять сервис в контроллер, а вместо этого обновляю его, как только яЗащищена строка подключения, а затем передана эта строка подключения службе.
Кроме того, учитывая, что теперь я добавил синглтон при запуске, мне нужно удалить исходную запись?:
services.AddDbContext<JobsLedgerAPIContext>(options => options.
UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("JobsLedger.API")));
эффективно заменив его моей единственной ссылкой, как показано ниже:
services.AddSingleton (typeof (IContextFactory <>), typeof (ContextFactory <>));