首页 > 解决方案 > 使用 .NET EF Core 5 TrackableEntities 更新多对多集合

问题描述

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

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

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

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

标签: many-to-manyentity-framework-core-2.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; }
}

您可以调用clear()的跟踪实例Foo,然后重新添加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();

推荐阅读