我在数据库中有2个表:User
和User Role
,它们之间是一对多的关系。
用户=> public ICollection<UserRole> UserRoles { get; set; }
UserRole => public User User { get; set; }
现在我需要删除用户,然后在UserRole
中删除它的角色。
我写这段代码:
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();
}
它可以工作,但是我需要编写最佳代码以使用最佳性能。
如何提高这段代码的效率?
答案 0 :(得分:1)
如何提高这段代码的效率?
配置数据库以对User和UserRole之间的外键约束实施级联删除,然后从EF中只需删除User。
您可以删除实体而无需先查询它。只需使用键属性构造一个实体实例,然后将其以增量状态附加到DbContext。
您的控制器可以很简单:
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();
}
没有级联删除,唯一有效的方法是使用存储命令。 EG:
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();
}
答案 1 :(得分:0)
在onMOdelCreating函数中,在Entities类中编写:
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);
}
在此邮政编码中,删除用户后删除所有用户角色。