簡體   English   中英

在EF Core中使用最佳做法刪除關系

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

我在數據庫中有2個表格: UserUser Role ,它們具有一對多的關系。

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

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

現在我需要刪除User,然后在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();
    }

它的工作,但是我需要編寫最好的代碼才能使用最好的性能。

如何提高此代碼的效率?

如何提高此代碼的效率?

配置數據庫以對User和UserRole之間的Foreign Key約束實施級聯刪除,然后從EF中,您可以簡單地刪除User。

請參閱級聯刪除-EF Core

而且,您可以刪除實體而無需先查詢它。 只需使用鍵屬性構造一個實體實例,然后將其以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();
    }

沒有級聯刪除,唯一有效的方法是使用存儲命令。 例如:

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

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

在此片段代碼中,刪除用戶后刪除所有用戶角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM