簡體   English   中英

EF Core 5.0 從嵌套集合中多對多刪除

[英]EF Core 5.0 Many-To-Many delete from nested collection

我的模型是這樣的(簡化):

    public class Request
    {
        public string Id { get; set; }
        public List<Tag> Tags { get; set; }
    }

    public class Tag
    {
        public string Id { get; set; }
        public List<Request> Requests { get; set; }
    }

DatabaseContext(如此處的文檔所示: Many-To-Many ):

    builder.Entity<Request>()
        .HasMany(r => r.Tags)
        .WithMany(f => f.Requests)
        .UsingEntity(j => j.ToTable("request_tags"));

如何在不刪除標簽本身的情況下從 Request.Tags 集合中刪除元素? 基本上我需要刪除連接表中的條目。 我在 controller 中嘗試過這樣的事情:

    [HttpGet("[action]")]
    public async Task<IActionResult> DeleteTag(string requestId, string tagId)
    {
        var request = await _context.Requests
                    .Include(r => r.Tags)
                    .SingleOrDefaultAsync(r => r.Id.Equals(requestId));

        var itemToDelete = request.Tags.SingleOrDefault(f => f.Id.Equals(tagId));
             
        request.Tags.Remove(itemToDelete);
        _context.Requests.Update(request); //AsNoTracking behaviour is enabled
        await _context.SaveChangesAsync();

        return Ok();
    }

而且它沒有效果。 我可以通過_context.Database.ExecuteSqlRaw()手動刪除連接表上的行,但這似乎是解決方法。 有沒有更好的辦法?

這是我的想法,我認為這是因為默認情況下 EF 要求您具有表現力,所以您不會傷害自己。 您的代碼稱為Update() ,這意味着您要更新記錄,而不是進行任何刪除。 它希望您對記錄集本身調用 Remove()。

將您的 Remove 調用更改為:

_context.Tags.Remove(itemToDelete);

更新:剛剛在這里看到這個,它可能是你正在尋找的,閱讀那個鏈接,雖然我從來沒有嘗試過:

.OnDelete(DeleteBehavior.ClientCascade);

暫無
暫無

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

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