Задать вопрос

Как включить AsNoTracking EF core?

Делаю проверку для начальных данных, если их нет что б добавились. Столкнулся с проблемой, при добавлении пользователю роли, выходит ошибка :
The instance of entity type 'User' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.

Методом Detach исправиль но не помогло. Сервис по добавлению пользователей перевел в Scoped, ничего не изменилось.
Services:
public static IServiceCollection InitServices(IServiceCollection services, IConfiguration configuration)
        {
           
           services.AddIdentity<User, IdentityRole>().AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationContext>();

           services.AddAutoMapper(typeof(ConfigureOfMapping));
           services.AddTransient<ConfigureOfMapping>();

           services.AddScoped(typeof(IUserService), typeof(UserService));
           services.AddTransient(typeof(IBookService), typeof(BookService));
           services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
           
           services.AddScoped<IUnitOfWork,UnitOfWorkRepo>();
            return services;
        }


Добавление пользователей и роли:
public UserRole(IUserService userService, IBookService bookService, IMapper mapper,IUnitOfWork work,IRepository<User>repository)
        {
            _userService = userService;
            _bookService = bookService;
            _mapper = mapper;
            _work = work;
            _repository = repository;
        }

        private readonly RegisterViewModel _admin = new RegisterViewModel()
        {
            Email = "Admin@gmail.com",
            FirstName = "Admin",
            Surname = "Admin",
            FullName = "AdminFull",
            Password = "Administrator",
            ConfirmPassword = "Administrator",
            UserName = "OnionAdmin"
        };

private string _adminRole = "Admin";

        public async Task CheckValue()
        {
            var admin = _mapper.Map<UserViewModel>(_admin);
//мапим пользователя
            if (await _userService.FindRole(_adminRole) == null)
            {
                await _userService.CreateRole(_adminRole);
            }
//Проверка есть ли роль и если нет создаем
            if (await _userService.FindUser(_admin.Email) == null)
            {
               await _userService.Create(_admin);
            }
//Проверка есть ли пользователь если нет создаем

            if (!await _userService.IsInRole(admin, _adminRole))
            {
                admin = _mapper.Map<UserViewModel>(await _userService.FindUser(_admin.Email) ) ;
                //получаю пользователя и его ID
                var result= await _userService.AddToRole(null, _adminRole,admin);;
           //добавление роли пользователю
            }


запуск кода:

public static async Task Main(string[] args)
        {
           IHost webHost= CreateHostBuilder(args).Build();
           using (var scoped=webHost.Services.CreateScope())
           {
               var con = scoped.ServiceProvider.GetService<UserRole>();
               await con.CheckValue();
           }
           webHost.Run();
        }


Что я делаю не так и как исправить это?
  • Вопрос задан
  • 277 просмотров
Подписаться 4 Средний 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы