Используйте лучшие практики для удаления отношений в EF Core - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть 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();
    }

его работа, но мне нужно написать лучшекод для использования наилучшей производительности.

Как повысить эффективность этого кода?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Как я могу улучшить эффективность этого кода?

Сконфигурируйте вашу базу данных для реализации каскадного удаления в ограничении внешнего ключа между пользователем и UserRole, а затем из EF вы можете просто удалить пользователя.

См. Каскадное удаление - 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();
    }
0 голосов
/ 15 апреля 2019

в функции onMOdelCreating, в классе сущностей напишите:

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

в этом фрагменте кода, все пользовательские роли удалены после удаления пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...