Entity Framework Core 2.0删除记录而不是更新记录

Eri*_*edy 6 entity-framework-core

我认为这可能是一个错误,但我可能会丢失一些可以解释此行为的信息。任何帮助,将不胜感激。

### Technical details
EF Core version: Microsoft.EntityFrameworkCore (2.0.1)
Database Provider: Microsoft.EntityFrameworkCore.SqlServer (2.0.1)
Database: SQL Server 2008
Operating system: Windows 10
IDE: Visual Studio 2017 Community Edition (15.4.4)
Run Code Online (Sandbox Code Playgroud)

我在C#控制台应用程序中遇到了一种情况,我在DbContext上调用Update(位置是LocationParty):

_context.Update(location);
Run Code Online (Sandbox Code Playgroud)

记录中唯一的更改是EndDate字段。在调用SaveChangesAsync()之前,检查_context.ChangeTracker会显示该实体已标记为已修改。正在跟踪的其他43个实体都标记为“不变”。

监视窗口图像显示了修改后的实体状态

SaveChangesAsync()的返回值为1,表示一个实体已更改。执行的SQL是delete语句,而不是更新,这导致记录被删除而不是更新:

Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (28ms) [Parameters=[@p0='8431'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [LocationParties]
WHERE [ID] = @p0;
SELECT @@ROWCOUNT;
Run Code Online (Sandbox Code Playgroud)

调用数据库更改的代码(使用存储库模式)在此控制台应用程序和MVC应用程序之间共享。当从MVC应用程序调用相同的更新位置代码时,记录将正确更新。请注意,当由MVC控制器运行时,调用SaveChangesAsync()时仅跟踪一个实体,并且该实体也标记为“已修改”。在控制台应用程序中,有44个实体被跟踪,只有感兴趣的实体标记为已修改。我查看是否可能存在另一个处于删除状态的实体实例,但没有这样的实体。

更新:

我可能已经知道发生了什么事,但不知道这种行为是否可以预期。

LocationParty实体与Party实体具有一对多关系(一个Party具有多个位置)。如果我没记错的话,当我第一次开始使用EF时,遇到一些关于跟踪已被跟踪(在我的MVC应用程序中)的对象的EF错误。位置方具有方实体(PartyID)的外键和方实体的导航属性。在更新方法中,我已经看到Party导航属性在更新之前为null以消除此问题。外键仍设置为指向该方。

我假设EF从导航属性null中取消,以推断该党已被删除,因此应该删除关联的位置。没有通过更新删除该方。我无法解释为什么它适用于MVC应用程序,但不适用于控制台应用程序。

我注释掉了将Party导航属性设置为null的代码,并在控制台和MVC应用程序中正确更新了位置。

我的代码有点怪异,但我认为只需将外键设置为指向有效实体即可。

pwr*_*imo 0

发生此问题的原因是 EF 的 StateManager 中的错误。可能的解决方法是在模型配置中删除.OnDelete(DeleteBehavior.Cascade).OnDelete(DeleteBehavior.ClientCascade),以支持手动删除依赖实体。

它已于 2020 年修复(请参阅提交),但修复仅在以后的版本中出现,因此 EF Core 2.2.6 至今仍受到此错误的影响。