C# 使用EF Core中删除关系的最佳实践

C# 使用EF Core中删除关系的最佳实践,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我在数据库中有两个选项卡:User和User-Role,它们是一对多关系 用户=>public ICollection用户角色{get;set;} 用户角色=>公共用户用户{get;set;} 现在我需要删除用户,然后在UserRole中删除它的角色 我写这段代码: public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken) {

我在数据库中有两个选项卡:
User
User-Role
,它们是一对多关系

用户=>
public ICollection用户角色{get;set;}

用户角色=>
公共用户用户{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();
    }
公共异步任务DeleteUser(DeleteDto DeleteDto,CancellationToken CancellationToken)
{
var user=userManager.Users.Include(x=>x.UserRoles).FirstOrDefault(c=>c.Id==deleteDto.Id);
移除(user.UserRoles.OrderBy(c=>c.UserId).FirstOrDefault(x=>x.UserId==user.Id));
wait_userService.deleteAncy(用户,cancellationToken);
返回Ok();
}
它的工作,但我需要写最好的代码使用最佳性能


如何提高此代码的效率?

在onMOdelCreating函数中的Entities类write中:

        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);
        }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasMany(e=>e.UserRole)
.WithRequired(e=>e.User)
.HasForeignKey(e=>e.UserId)
.WillCascadeOnDelete(真);
}
在这段代码中,删除用户后删除了所有用户角色

如何提高此代码的效率

将数据库配置为在User和UserRole之间的外键约束上实现级联删除,然后从EF您可以简单地删除用户

您可以删除实体,而无需首先查询它。只需构造一个具有键属性的实体实例,并以delted状态将其附加到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();
    }
公共异步任务DeleteUser(DeleteDto DeleteDto,CancellationToken CancellationToken)
{
使用(var db=new db())
{
Remove(新用户(){Id=deleteDto.Id});
等待db.saveChangesSync(取消令牌);
}
返回Ok();
}
如果没有级联删除,唯一有效的方法是使用Store命令。例如:

    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();
    }
公共异步任务DeleteUser(DeleteDto DeleteDto,CancellationToken CancellationToken)
{
使用(var db=new db())
使用(var tran=db.Database.BeginTransaction())
{
等待db.Database.ExecuteSqlCommandAsync(“从UserRole中删除,其中UserId=@id”,cancellationToken,deleteDto.id);
等待db.Database.ExecuteSqlCommandAsync(“从用户中删除,其中UserId=@id”,cancellationToken,deleteDto.id);
trans.Commit();
}
返回Ok();
}

我知道可以使用级联删除,但在我的项目中,我需要使用
RestricDeleteBehavior
来实现此
行为
方法是什么