C# 实体框架更改了列表的内容

本文关键字:列表 实体 框架 | 更新日期: 2023-09-27 18:31:28

我遇到了一个非常奇怪的故障,我相信实体框架是罪魁祸首。这是正在发生的基本场景。我有一个实体对象 Foo,其中包含一个导航属性集合 Bar。 在此上下文中,Foo 由实体框架更改跟踪进行跟踪。我运行以下代码,但结果很奇怪

var NewBars = CreateBars(); //CreateBars returns a List<Bars> with two items
//After this code is ran, Foo.Bars AND NewBars will both be lists with 4 items.
//I think its because Foo.Bars has dynamic proxies, entity framework edits bars
//To re-insert the overwritten proxies. 
Foo.Bars = NewBars;

如果我在 var NewBars = CreateBars() 行处放置一个断点,并逐个执行它,一切都会按预期出现。Foo.Bars将是一个双项目列表,NewBars将是一个两个项目列表。但是,如果我在没有断点的情况下运行执行,或者在设置 Foo.Bars = NewBar 后中断点,那么这两个列表都会奇迹般地更改为 4 个项目列表。对我来说很奇怪,即使是右手价值列表也在改变。

有一次,即使我在断点处停止执行,我也检查了 newbar 的内容,第一次查看时是 2,下次查看时是 4。当程序停止时,它发生了变化,所以我知道幕后发生了一些事情。

问题是因为它不断重新插入代理,所以我得到主键冲突。如果代理没有重新插入,那么一切都很好。我只是想知道,我该如何解决这个问题?我只是想将 Foo.Bars 设置为新的项目列表。关于这个问题的任何方向将不胜感激!谢谢!

C# 实体框架更改了列表的内容

在分配newBars之前,您希望对Foo.Bars中的Bar发生什么?

你需要以某种方式处理它们。它们由数据库中Bar表中的行重置,对吗?

您可以使用以下内容完全删除这些旧Bar

dbContext.Bars.RemoveRange(Foo.Bars);
dbContext.SaveChages();

然后分配新柱线:

Foo.Bars = NewBars;
dbContext.SaveChanges();

或者,如果您仍然希望旧Bar存在于数据库中但不链接到Foo那么您可以执行以下操作:

Foo.Bars=null;
Foo.Bars = newBars;
dbContext.SaveChanges();

(当然,这假设您的数据库架构允许这样做而不会违反任何约束)