简体   繁体   English

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

[英]Use the Best Practice for Relation Delete in EF Core

I have 2 tabel in database : User and User Role and they are have one to many relation. 我在数据库中有2个表格: UserUser Role ,它们具有一对多的关系。

User => public ICollection<UserRole> UserRoles { get; set; } User => public ICollection<UserRole> UserRoles { get; set; } public ICollection<UserRole> UserRoles { get; set; }

UserRole => public User User { get; set; } UserRole => public User User { get; set; } public User User { get; set; }

now i need to delete User and then Delete it Role in UserRole . 现在我需要删除User,然后在UserRole中将其删除。

i write this code : 我写这段代码:

 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();
    }

its work but i need to write best code for use the best performance . 它的工作,但是我需要编写最好的代码才能使用最好的性能。

How can I improve the efficiency of this code? 如何提高此代码的效率?

How can I improve the efficiency of this code? 如何提高此代码的效率?

Configure your database to implement cascade deletes on the Foreign Key constraint between User and UserRole, and then from EF you can simply delete the User. 配置数据库以对User和UserRole之间的Foreign Key约束实施级联删除,然后从EF中,您可以简单地删除User。

See Cascade Delete - EF Core 请参阅级联删除-EF Core

And you can delete an entity without first querying it. 而且,您可以删除实体而无需先查询它。 Just construct an entity instance with the key properties, and attach it to the DbContext in a delted state. 只需使用键属性构造一个实体实例,然后将其以delted状态附加到DbContext。

Your controller can be as simple as: 您的控制器可以很简单:

   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();
    }

Without cascade deletes, the only efficient way to do this is with Store Commands. 没有级联删除,唯一有效的方法是使用存储命令。 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();
    }

in onMOdelCreating function, in Entities Class write: 在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);
        }

in this piece code, deleted all user Roles after deleted a user. 在此片段代码中,删除用户后删除所有用户角色。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM