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

时间:2017-11-16 16:18:30

标签: 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)

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

_context.Update(location);

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

Watch Window Image showing Modified Entity Status

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

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;

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

更新:

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

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

我假设EF键入的导航属性为null,以推断Party已被删除,因此应删除关联的位置。更新未删除该方。我无法解释为什么它适用于MVC应用程序而不适用于控制台应用程序。

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

我的代码有点奇怪,但我认为将外键设置为指向有效实体将是所有必需的。

0 个答案:

没有答案