【问题标题】:Updating Many To Many collection using .NET EF Core 5 TrackableEntities使用 .NET EF Core 5 TrackableEntities 更新多对多集合
【发布时间】:2021-04-19 22:34:55
【问题描述】:

经过几个晚上的反复试验,我一直无法找到一种方法来更新与可跟踪实体的多对多关系中的自定义类型集合。

我有一个类型Bar,可以分配给Foo (Foo.Bars) 的集合成员。在 API 消费者中,用户从列表中选择零对多 Bar,这意味着可以从 Foo.Bars 集合中添加或删除 Bars。

这是在 MVC 设置中,这就是我使用 TrackableEntities 来管理更新属性的原因。我管理的最好的方法是将选中的Bar 添加到集合中。如果在 Foo.Bars 集合中已经有 Bars 的 Foo 被回发,而对 .Bars 集合没有任何更改,则 EF 会在再次添加相同的 Bar 时产生外键冲突。从前端的列表中删除一个 Bar 并使用集合的新所需状态将集合发回并不会在保存时删除所需的 Bar(s)。我玩弄了将这些Bar 的 TrackingState 设置为删除或修改,但它似乎被忽略了,这确实有意义 - Bar 实体没有被更新或删除;应该更改的是 Foo.Bars 属性。

是否有人使用过 TrackableEntities 并能够管理 EF Core 5 多对多导航属性? TrackableEntities/TrackableEntities.Core.Sample 项目中没有它的示例。显然 TrackableEntities 在 2015 年就获得了 M-to-M 支持,但从那以后我一直找不到任何人谈论它。

【问题讨论】:

    标签: many-to-many entity-framework-core-2.1


    【解决方案1】:

    假设你的多对多是这样建模的:

    public class Foo {
        Guid Id { get; set; }
        ICollection<Bar> Bars { get; set; }
    }
    
    public class Bar {
        Guid Id { get; set; }
        ICollection<Foo> Foos { get; set; }
    }
    

    您可以在跟踪的Foo 实例上调用clear(),然后重新添加您要分配的Bar 实例。我发现可以避免约束异常。

    var foo = context.Foos.Include(x => x.Bars).FirstOrDefault(x => x.Id == someGuid);
    foo.Bars.Clear();
    foo.Bars.Add(bar1);
    foo.Bars.Add(bar2);
    ...
    context.Update(foo);
    context.SaveChanges();
    

    【讨论】:

    • 这就是我最终做的事情......谢天谢地,我现在不需要它来表现出色。但这似乎是 TrackableEntities 应该能够处理的事情。避免这种笨拙的方法是 TrackableEntities 的重点。
    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2021-09-15
    相关资源
    最近更新 更多