Usando .net 5 e identidad, no puedo averiguar cómo configurar AutoSaveChanges en mi archivo de inicio. Si algo falla durante el registro o el código de inicio de sesión, necesito hacer una gran limpieza en mis tablas de usuario.
services.AddDefaultIdentity<MyUser() .AddRoles<IdentityRole().AddEntityFrameworkStores<MyDbContext>();Veo una respuesta en Impedir que UserManager de ASP.NET Identity guarde automáticamente , pero no sé cómo se relaciona esto con mi servicio de inicio.
Encontré una publicación anterior que aún funciona para .NET 5.
Para desactivar AutoSave en UserManager, debe registrar un UserStore personalizado. Para hacer esto, crea un nuevo archivo:
public class CustomUserStore : UserStore<IdentityUser> // important to use custom Identity user object here! { public CustomUserStore(AppDbContext context) : base(context) { AutoSaveChanges = false; } }En Startup.cs, agregue la inyección de dependencia agregando lo siguiente a ConfigureServices:
services.AddScoped<IUserStore<IdentityUser>, CustomUserStore>();
¡Asegúrate de usar el mismo objeto de identidad o no funcionará!
Ahora, cuando hace esto, UserManager aún no funciona completamente sin guardar al usuario en la base de datos antes de agregar notificaciones o roles. Debe implementar su propia reversión de datos si las cosas fallan. Por ejemplo, mi AuthController tiene lógica para intentar agregar un rol. Si eso falla, eliminaré al usuario recién creado:
var isCreated = await _userManager.CreateAsync(newUser, user.Password); await _context.SaveChangesAsync(); if (!isCreated.Succeeded) { var roleResult = await _userManager.AddToRoleAsync(newUser, "User"); if (!roleResult.Succeeded) { throw new Exception("not saved"); } await _context.SaveChangesAsync(); var jwtToken = await GenerateAuthResult(newUser, null); return Ok(jwtToken); // or whatever response needed } else { await _userManager.DeleteAsync(newUser); await _context.SaveChangesAsync() return BadRequest( // add response ); }Publicación anterior:AutoSaveChanges de UserManager en .NET Core 2.1
Problema publicado en Identity que no es completamente transaccional: https://github.com/dotnet/aspnetcore/issues/18407