Ho 2 tabel nel database: User
and User Role
e hanno una relazione da uno a molti.
User => public ICollection<UserRole> UserRoles { get; set; }
UserRole => public User User { get; set; }
ora UserRole
eliminare Utente e quindi Elimina ruolo in UserRole
.
scrivo questo codice:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
var user = userManager.Users.Include(x => x.UserRoles).FirstOrDefault(c => c.Id == deleteDto.id);
user.UserRoles.Remove(user.UserRoles.OrderBy(c => c.UserId).FirstOrDefault(x => x.UserId == user.Id));
await _userService.DeleteAsync(user, cancellationToken);
return Ok();
}
funziona ma devo scrivere il codice migliore per utilizzare le migliori prestazioni.
Come posso migliorare l'efficienza di questo codice?
Come posso migliorare l'efficienza di questo codice?
Configura il tuo database per implementare le eliminazioni a cascata sul vincolo di chiave esterna tra User e UserRole, quindi da EF puoi semplicemente eliminare l'utente.
E puoi eliminare un'entità senza prima interrogarla. Basta costruire un'istanza di entità con le proprietà chiave e collegarla a DbContext in uno stato delted.
Il controller può essere semplice come:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
{
db.Users.Remove(new User() { Id = deleteDto.id });
await db.SaveChangesAsync(cancellationToken);
}
return Ok();
}
Senza le eliminazioni in cascata, l'unico modo efficace per farlo è con i comandi Store. PER ESEMPIO:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
using (var tran = db.Database.BeginTransaction())
{
await db.Database.ExecuteSqlCommandAsync("delete from UserRole where UserId = @id", cancellationToken, deleteDto.id);
await db.Database.ExecuteSqlCommandAsync("delete from User where UserId = @id", cancellationToken, deleteDto.id);
tran.Commit();
}
return Ok();
}
nella funzione onMOdelCreating, nella classe Entities scrivi:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasMany(e => e.UserRole)
.WithRequired(e => e.User)
.HasForeignKey(e => e.UserId)
.WillCascadeOnDelete(true);
}
in questo codice pezzo, eliminato tutti i ruoli utente dopo aver eliminato un utente.