В проекте 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
Невозможно получить доступ к удаленному объекту в ASP.NET Core при внедрении DbContext. ⇐ C#
Место общения программистов C#
1737453758
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.
Как это исправить?
[b]ОБНОВЛЕНИЕ[/b]
Поэтому я изменил код на:
services.AddScoped();
services.AddScoped();
Но я получаю ту же ошибку...
[b]ОБНОВЛЕНИЕ — код исходных данных внутри метода настройки при запуске[/b]
Итак, при настройке метода у меня есть:
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
}
}
Что мне не хватает?
[b]ОБНОВЛЕНИЕ – возможное решение[/b]
Изменение моего метода Seed на следующий, кажется, работает:
using (IServiceScope scope =
_provider.GetRequiredService().CreateScope()) {
Context context = _provider.GetService();
// Insert data in database
}
Подробнее здесь: [url]https://stackoverflow.com/questions/38704025/cannot-access-a-disposed-object-in-asp-net-core-when-injecting-dbcontext[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия