many-to-many - 使用 .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 支持,但从那以后我一直找不到任何人谈论它。
解决方案
假设您的多对多建模如下:
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();
推荐阅读
- azure-devops - azure pipeline 插件选择框如何使用自己的数据
- c - 使用 fgetc 获取字符
- asp.net - Handles 子句需要 WithEvents 回调
- javascript - HTML 在单击时显示图形,但在烧瓶中访问时不显示
- azure - Azure 租户是一个目录?
- sql - 使用 LAG() 检查以前的时间表中是否存在现有输入
- mysql-workbench - 如何在选择条件mysql中选择计数
- python - 这个错误的解决方法是什么 TypeError: strptime() argument 1 must be str, not datetime.date
- api - get 请求返回 200(OK),但响应值部分没有内容。值为 [] 空
- firebase - 在 Firebase 中,我们如何通过颤振向文档添加更多字段?