在EF Core中使用最佳做法删除关系

时间:2019-04-15 14:03:54

标签: c# entity-framework entity-framework-core

我在数据库中有2个表:UserUser 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();
    }

它可以工作,但是我需要编写最佳代码以使用最佳性能。

如何提高这段代码的效率?

2 个答案:

答案 0 :(得分:1)

  

如何提高这段代码的效率?

配置数据库以对User和UserRole之间的外键约束实施级联删除,然后从EF中只需删除User。

请参见Cascade Delete - EF Core

您可以删除实体而无需先查询它。只需使用键属性构造一个实体实例,然后将其以增量状态附加到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);
        }

在此邮政编码中,删除用户后删除所有用户角色。

相关问题