Невозможно получить доступ к удаленному объекту в ASP.NET Core при внедрении DbContext.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно получить доступ к удаленному объекту в ASP.NET Core при внедрении DbContext.

Сообщение Anonymous »

В проекте ASP.NET Core при запуске происходит следующее:

services.AddDbContext(x => x.UseSqlServer(connectionString));

services.AddTransient();

services.AddTransient();


Служба проверки выглядит следующим образом:

public interface IValidationService {
Task ValidateAsync(T model);
}

public class ValidationService : IValidationService {
private readonly IServiceProvider _provider;

public ValidationService(IServiceProvider provider) {
_provider = provider;
}

public async Task ValidateAsync(T model) {
IValidator validator = _provider.GetRequiredService();

return await validator.ValidateAsync(model);
}
}


И ModelValidator выглядит следующим образом:

public class ModelValidator : AbstractValidator {
public ModelValidator(Context context) {
// Some code using context
}
}


Когда я внедряю IValidationService в контроллер и использую его как:

List errors = await _validator.ValidateAsync(order);


Я получаю сообщение об ошибке:


System.ObjectDisposeException: невозможно получить доступ к удаленному объект. Распространенной
причиной этой ошибки является удаление контекста, который был разрешен
в результате внедрения зависимостей, а затем попытка использовать тот же
экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы
вызываете Dispose() в контексте или помещаете контекст в оператор
using. Если вы используете внедрение зависимостей, вы должны
позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста
. Имя объекта: «Контекст».


Есть идеи, почему у меня возникает эта ошибка при использовании контекста внутри ModelValidator.

Как это исправить?

ОБНОВЛЕНИЕ

Поэтому я изменил код на:

services.AddScoped();

services.AddScoped();


Но я получаю ту же ошибку...

ОБНОВЛЕНИЕ — код исходных данных внутри метода настройки при запуске

Итак, при настройке метода у меня есть:

if (hostingEnvironment.IsDevelopment())
applicationBuilder.SeedData();


И расширение SeedData:

public static class DataSeedExtensions {
private static IServiceProvider _provider;

public static void SeedData(this IApplicationBuilder builder) {
_provider = builder.ApplicationServices;
_type = type;

using (Context context = (Context)_provider.GetService()) {
await context.Database.MigrateAsync();
// Insert data code
}
}


Что мне не хватает?

ОБНОВЛЕНИЕ – возможное решение

Изменение моего метода Seed на следующий, кажется, работает:

using (IServiceScope scope =
_provider.GetRequiredService().CreateScope()) {
Context context = _provider.GetService();
// Insert data in database
}


Подробнее здесь: https://stackoverflow.com/questions/387 ... -dbcontext
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»