简体   繁体   English

EF Core 5.0 从嵌套集合中多对多删除

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

My models are like this (simplified):我的模型是这样的(简化):

    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 (as shown in documentation here: Many-To-Many ): DatabaseContext(如此处的文档所示: Many-To-Many ):

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

How do I delete element from Request.Tags collection without deleteting tag itself?如何在不删除标签本身的情况下从 Request.Tags 集合中删除元素? Basically I need to delete entry in join table.基本上我需要删除连接表中的条目。 I tried in controller something like this:我在 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();
    }

And it takes no effect.而且它没有效果。 I can manually delete row on join table via _context.Database.ExecuteSqlRaw() but it seems like workaround.我可以通过_context.Database.ExecuteSqlRaw()手动删除连接表上的行,但这似乎是解决方法。 Is there a better way?有没有更好的办法?

Here is how I think about it, I assume it is because EF requires you to be expressive by default, so you don't hurt yourself.这是我的想法,我认为这是因为默认情况下 EF 要求您具有表现力,所以您不会伤害自己。 Your code called Update() , which means you want to update a record, not do any deletes.您的代码称为Update() ,这意味着您要更新记录,而不是进行任何删除。 It wants you to call Remove() on the record set itself.它希望您对记录集本身调用 Remove()。

As is change your Remove call to:将您的 Remove 调用更改为:

_context.Tags.Remove(itemToDelete);

Update: Just saw thishere , it might be what you are looking for, read that link, I've never tried it though:更新:刚刚在这里看到这个,它可能是你正在寻找的,阅读那个链接,虽然我从来没有尝试过:

.OnDelete(DeleteBehavior.ClientCascade);

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

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