Делаю проверку для начальных данных, если их нет что б добавились. Столкнулся с проблемой, при добавлении пользователю роли, выходит ошибка :
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();
}
Что я делаю не так и как исправить это?