繁体   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