Создайте EF Core Context один раз для каждого запроса в ASP.Net Core. - PullRequest
0 голосов
/ 18 января 2019

После прочтения этой темы, похоже, хороший подход - создать контекст один раз для каждого запроса.

Чтобы добиться этого, в Startup.cs я объявил два статических объекта

public class Startup
{
    public static DbContextOptionsBuilder<MCContext> optionsBuilder = new DbContextOptionsBuilder<MCContext>();
    public static MCContext db = null;

затем инициализируйте optionsBuilder при запуске приложения (только один раз):

public Startup(IConfiguration configuration)
{
    optionsBuilder.UseSqlServer(configuration["ConnectionStrings:DefaultConnection"]);
}

в то время как дБ при каждом запросе:

app.Use(async (context, next) =>
{
    db = db ?? new MCContext(optionsBuilder.Options);
    await next.Invoke(); 
});

Тогда, когда мне нужен контекст в контроллере или на бритвенной странице cs, я могу получить его с помощью Startup.db:

User cur = await Startup.db.User.Where(x => x.Id == uid).FirstOrDefaultAsync();

Я не располагаю контекстом согласно здесь

Поскольку я не знаком с DI, мне интересно, правильный ли этот подход или я что-то упускаю.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

на базе Что нового в EF Core 2.0 - EF Core |Документы Microsoft

Если вы хотите новый контекст один раз для каждого запроса: AddDbContext

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContext<MCContext >(
     options => options.UseSqlServer(connectionString));
 }

, тогда вы можете

public class TiketsController : ControllerBase
{
    private readonly MCContext _context;

    public TiketsController (MCContext context)
    {
        _context = context;
    }
 }

Базовый шаблон дляиспользование EF Core в приложении ASP.NET Core обычно включает в себя регистрацию пользовательского типа DbContext в системе внедрения зависимостей и последующее получение экземпляров этого типа через параметры конструктора в контроллерах.Это означает, что новый экземпляр DbContext создается для каждого запроса.

, но если вам нужно высокопроизводительное / безопасное повторное использование: AddDbContextPool

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContextPool<MCContext >(
     options => options.UseSqlServer(connectionString));
 }

, тогда вы можете

public class TiketsController : ControllerBase
{
    private readonly MCContext _context;

    public TiketsController (MCContext context)
    {
        _context = context;
    }
 }

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

0 голосов
/ 18 января 2019

Если вы не создаете объект, не утилизируйте его. Пусть контейнер IOC справится с этим.

Кстати, я не думаю, что этот блок кода требуется. MCContext является зависимостью, поэтому создание и внедрение его экземпляра выполняется контейнером IOC.

app.Use(async (context, next) =>
{
    db = db ?? new MCContext(optionsBuilder.Options);
    await next.Invoke(); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...