Не удается получить доступ к удаленному экземпляру контекста

Мое приложение: веб-приложение .Net Core 3.1 с использованием микросервисной архитектуры; Идентификация для авторизации и аутентификации в виде отдельного API микросервиса.

Я расширил стандартную таблицу AspNetUsers и AspNetRoles настраиваемыми полями. Получение следующей ошибки при попытке создать новую роль с помощью Identity RoleManager.

Не удается получить доступ к удаленному экземпляру контекста. Распространенная причина этого ошибка удаляет экземпляр контекста, который был разрешен из внедрение зависимости, а затем попытка использовать тот же контекст экземпляр в другом месте вашего приложения. Это может произойти, если вы вызов 'Dispose' в экземпляре контекста или обертывание его в использование заявление. Если вы используете внедрение зависимостей, вы должны разрешить Контейнер для инъекций зависимостей позаботится об удалении контекста экземпляры. Имя объекта: 'MembershipDBContext'.

Найдите мой код ниже

Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            var idenConnectionString = Configuration["DbContextSettings:IdentityConnectionString"];
            var userConnectionString = Configuration["DbContextSettings:UserConnectionString"];
            var dbPassword = Configuration["DbContextSettings:DbPassword"];
            var builder = new NpgsqlConnectionStringBuilder(idenConnectionString)
            {
                Password = dbPassword
            };
            var userBuilder = new NpgsqlConnectionStringBuilder(userConnectionString)
            {
                Password = dbPassword
            };

            services.AddDbContext<MembershipDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));
            services.AddDbContext<UserDBContext>(opts => opts.UseNpgsql(userBuilder.ConnectionString));

            

            services.AddIdentity<MembershipUser, MembershipRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
            }).AddRoles<MembershipRole>().AddEntityFrameworkStores<MembershipDBContext>()
            .AddDefaultTokenProviders();


            services.AddTransient<IIdentityMSService, IdentityMSService>();//IdentityMS
            services.AddTransient<IAdministrationService, AdministrationService>();//IdentityMS

            services.AddTransient<IIdentityMSRepository, IdentityMSRepository>();//IdentityMS
            services.AddTransient<IAdministrationRepository, AdministrationRepository>();//IdentityMS
            services.AddTransient<UserDBContext>();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            
            services.AddMediatR(typeof(Startup));
            RegisterServices(services);
        }

ЧленствоDBContext.cs

    public class MembershipDBContext : IdentityDbContext<MembershipUser,MembershipRole,string>
    {
        public MembershipDBContext(DbContextOptions<MembershipDBContext> options) : base(options)
        {
        }
    }

АдминистрацияКонтроллер

 public class AdministrationController : Controller
    {
        private readonly IAdministrationMVCService _adminService;

        public AdministrationController(IAdministrationMVCService adminService)
        {
            _adminService = adminService;            
        }

        // GET: AdministrationController/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: AdministrationController/Create
        [HttpPost]
        //[ValidateAntiForgeryToken]
        public async Task<IActionResult> CreateAsync(MembershipRole rm)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    rm.CompanyId = 1;
                    await _adminService.AddRoles(rm);
                    //return RedirectToAction(nameof(Index));
                    return View();
                }
                catch
                {
                    return View();
                }
            }
            return View();
        }

      
    }

АдминистрированиеApiController

[HttpPost]
        public void Post([FromBody] MembershipRole role)
        {
            _adminMSService.AddRoles(role);
        }

АдминистрацияРепозиторий

public class AdministrationRepository : IAdministrationRepository
    {
        private readonly RoleManager<MembershipRole> _roleManager;
        private readonly UserManager<MembershipUser> _userManager;

        public AdministrationRepository(RoleManager<MembershipRole> roleManager, UserManager<MembershipUser> userManager)
        {            
            _roleManager = roleManager;
            _userManager = userManager;
        }

        public async Task AddRolesAsync(MembershipRole rvm)
        {
            try
            {
                IdentityResult result = await _roleManager.CreateAsync(rvm);
                if (result.Succeeded) {

                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }

    }

Я пытался сделать сервисы и репозитории одноэлементными, но это тоже не сработало. Что мне здесь не хватает? Любые идеи?

В какой строке кода вы получаете ошибку? Я не вижу, где эта проблема может возникнуть в этом коде.

DavidG 18.12.2020 12:37

получение исключения в этой конкретной строке: IdentityResult result = await _roleManager.CreateAsync(rvm);

Graison K 18.12.2020 12:46

Это довольно запутанно, потому что у вас есть репозитории, сервисы повсюду, и вы не показываете их все. Первое, что нужно проверить — используете ли вы все асинхронные методы? Потому что я вижу в экшене await, что ты там этого не делаешь.

DavidG 18.12.2020 12:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
3
11 552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решил проблему! Как отметил в своем комментарии DavidG, я пропустил ключевое слово «ожидание» в некоторых местах, таких как AdministrationApiController. Публикация здесь как «Ответ», так как я не могу пометить комментарий как «Ответ».

Другие вопросы по теме