首页 > 解决方案 > EF Core 不会根据关系属性进行更新

问题描述

我对更新模型的 EF Core 一般行为有疑问。我有以下模型类:

public class Province
{
     public int Id { get; set; }
     public string Name { get; set; }
}

public class City
{
     public int Id { get; set; }
     public string Name { get; set; }
     public int? ProvinceId { get; set; }
     public virtual Province Province { get; set; }
}

当我City在 UI 中获取要编辑的内容时,我将Province其包含在内,以便 UI 可以完美地显示模型。现在用户想要更改Provincefor a City

当用户更改Province下拉列表时,ProvinceId模型的City会发生变化,但Province对象仍然是相同的。

因此,当我将模型发送到后端时,EF Core 不会更新模型。

示例 - 原始模型:

City: { Id: 1, Name: "City1", ProvinceId: 1, Province: { Id: 1, Name: "Province1" } }

UI中的更改模型:

City: {Id: 1, Name: "City1", ProvinceId: 2, Province: { Id: 1, Name: "Province1" } }

我希望 EF Core 将其更新ProvinceId2,但事实并非如此,因为该Province属性仍然是旧的,除非我将Province属性设置null为更改不会正确应用。

有没有办法改变 EF Core 的这种行为,以便它会根据关系属性更新模型?

我正在使用 EF Core 5.0。

标签: c#asp.net-coreentity-framework-core

解决方案


有没有办法改变 EF Core 的这种行为,以便它会根据关系属性更新模型?

它已经在这样做了。在模型级别的关系由参考/导航定义。您发送了相关Province信息,EFCity根据该信息进行了更新。

您应该注意到City您发送的数据的不一致 - 它的ProvinceId值为 2,但随后您有Province与1 相关的值。当 EF在模型级别(之前)Id更新实体的值时,它会设置所有数据属性,并且值为设置为 2。但是,当它设置引用时,值更新为 1。所以这就是当你调用时发送到数据库的值。CitySaveChangesProvinceIdProvinceProvinceIdSaveChanges()

要更新父引用,只需发送外键属性,并避免引用本身 -

City: {Id: 1, Name: "City1", ProvinceId: 2 }

如果由于任何原因无法做到这一点,则Province在更新City.


推荐阅读