Как использовать блок «Использование», когда DbContext имеет параметр DbContextOptionsBuilder - PullRequest
0 голосов
/ 28 февраля 2019

Когда я запускаю свое приложение в файле Startup.cs, я должен передать строку подключения из файла appsettings в мой DbContext следующим образом:

services.AddDbContext<ManagementStudioDbContext>(options => options.UseSqlServer(Configuration["DatabaseConfiguration:ConnectionString"]));

В моем классе ContextFactory, где мой DbContextсоздается, он передает переменную DbContextOptionsBuilder в мой DbContext, а также вот так:

public ManagementStudioDbContext CreateDbContext(string[] args)
{
    //Debugger.Launch();
    IConfigurationRoot configuration = new ConfigurationBuilder()
    .SetBasePath(ConfigurationManager.GetBasePath(Environment.GetEnvironmentVariable("CENTRAL_APPLICATION_SETTINGS")))
    .AddJsonFile("mssettings.json")
    .Build();
    var builder = new DbContextOptionsBuilder<ManagementStudioDbContext>();
    builder.UseSqlServer(configuration["DatabaseConfiguration:ConnectionString"]);
    return new ManagementStudioDbContext(builder.Options);
}

Вот как я объявил свой DbContext:

public ManagementStudioDbContext(DbContextOptions<ManagementStudioDbContext> options) : base(options)
{

}

Однако это проблема, когда яЯ хочу использовать блок using (), так как мне нужно будет передать ему параметр параметров типа.Что я могу передать, чтобы использовать это с помощью блока ()?

1 Ответ

0 голосов
/ 28 февраля 2019

Просто нет. никогда было бы неприемлемо для использования контекста EF с using, но теперь, когда все вводится зависимостью, это совершенно невозможно.Если вам нужна копия вашего контекста, вам нужно внедрить ее в конструктор вашего класса:

public class Foo
{
    private readonly ManagementStudioDbContext _context;

    public Foo(ManagementStudioDbContext context)
    {
        _context = context ?? throw new ArgumentNullException(nameof(context));
    }

    ...
}

Контекст ограничен, поэтому, если вам это нужно в объекте синглтонного типа, выдолжны использовать анти-шаблон сервис-локатор.Внедрите IServiceProvider в ваш класс с единственным временем жизни, а затем, когда вам понадобится копия вашего контекста:

using (var scope = provider.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<ManagementStudioDbContext>();
    // do something with context
}

Это называется антипаттен, потому что вам следует избегать этого, если это вообще возможно.Вообще говоря, объекты не должны работать с объектами с более ограниченным временем жизни, чем они сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...