Entity Framework Core - удаляется при попытке запустить 2-й запрос - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблема с удалением контекста базы данных.Я настроил базы данных, как показано ниже в методе настройки служб.Код был упрощен, чтобы, надеюсь, его было легче читать.

public void ConfigureServices(IServicesCollection services)
{
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database1")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database2")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database3")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database4")));

      Services.AddScoped<IQueryService1, ConcreteService1>();
      Services.AddScoped<IQueryService1, ConcreteService2>();
      Services.AddScoped<IQueryService1, ConcreteService3>();
      Services.AddScoped<IQueryService1, ConcreteService4>();
}

Теперь в один из контроллеров я добавляю соответствующие сервисы, которые требуются.

[Produces("application/json")]
[Route("api/[controller]/[action]
public class DigitalFinesController : Controller
{
      private readonly IQueryService1 _Service1;

      public DigitalFinesController(IConfiguration configuration, IQueryServices1 QueryService1)
      {
         _Service1 = QueryService1;
      }

      [Authorize]
      [HttpPost]
      [ActionName("SubmitFine")]
      [ProducesResponseType(200)]
      [ProducesResponseType(401)]
      public async Task<IActionResult> SubmitFine([FromBody] Models.DigitalFine fine)
      {
         //This is a simple version of my issue
         var vehicles = _Service1.Vehicles.FirstOrDefault(p=> p.vrm == "OX7 DFG");
         if(vehicle == null)
         {
            return BadRequest("Vehicle is missing");
         }

         var fleet = _Service1.Fleets.FirstOrDefault(p=> p.Code = "MyCode");
      }
}

И как только я получаюко второму запросу я получаю следующее исключение

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту.Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения.Это может произойти, если вы вызываете Dispose () для контекста или заключаете контекст в оператор using.Если вы используете внедрение зависимостей, вы должны позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста.

И я должен понять, почему это происходит.Кто-нибудь может дать мне указатель, чтобы это исправить?

Большое спасибо, Саймон

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

.AddScoped будет располагать после первого вызова базы данных объекта:

См. Документацию: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

В этом разделе:

ВВ примере приложения служба IMyDependency зарегистрирована с конкретным типом MyDependency.Регистрация охватывает срок службы службы до времени жизни одного запроса.Время жизни службы описано далее в этом разделе.

0 голосов
/ 12 декабря 2018

Я думаю, что это может иметь отношение к тому, как вы регистрируете это.Попробуйте зарегистрировать его с помощью AddSingleton вместо AddScoped

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#service-lifetimes-and-registration-options

Scoped

Службы продолжительности действия Scoped создаются один раз для каждого запроса.

Предупреждение

При использовании службы промежуточного уровня в промежуточном программном обеспечении внедрите службу в метод Invoke или InvokeAsync.Не вводите с помощью инжектора конструктора, потому что это заставляет сервис вести себя как одиночка.Дополнительные сведения см. В разделе ASP.NET Core Middleware.

Singleton

Службы времени жизни Singleton создаются при первом запросе (или при запуске ConfigureServicesи экземпляр указывается при регистрации услуги).Каждый последующий запрос использует один и тот же экземпляр.Если приложение требует одноэтапного поведения, рекомендуется разрешить контейнеру службы управлять временем жизни службы.Не реализуйте шаблон проектирования синглтона и предоставьте пользовательский код для управления временем жизни объекта в классе.

Предупреждение

Опасно разрешать службу с определенными областями из одного объекта.Это может привести к неправильному состоянию службы при обработке последующих запросов.

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