EF Core更新导航属性,但FK隐藏属性未更新

时间:2019-03-08 07:22:45

标签: c# .net-core ef-core-2.2

public class Location
{
    [JsonProperty("Id")]
    public int Id { get; set; }

    [JsonProperty("Name")]
    [Required]
    public string Name { get; set; }

    [JsonProperty("Address")]
    public string Address { get; set; }

    public NpgsqlTsVector SearchVector { get; set; }

    /**
    Navigation Property
     */

    public Location ParentLocation { get; set; }

    [JsonProperty("Children")]
    public virtual ICollection<Location> ChildrenLocation { get; set; }

}

此自引用实体类在数据库中生成字段“ ParentLocationId”(隐藏键)。

使用以下代码更新时添加。.

    public async Task<Location> UpdateLocation(Location location, int? moveToParentLocation)
    {
        // this work
        // _context.Entry(location).Property("ParentLocationId").CurrentValue = moveToParentLocation;

        // this not work
        _context.Entry(location).Reference(loc => loc.ParentLocation).CurrentValue = null;

        _context.Locations.Update(location);

        await _context.SaveChangesAsync();

        return location;
    }

Reference()不起作用,因为我不想用Property()对数据库字段进行硬编码,所以我做错了什么。

PS。发送给此方法的位置尚未附加到DBContext

1 个答案:

答案 0 :(得分:2)

方法的设计需要设置阴影FK属性。如果您不想对名称进行硬编码,则可以使用NavigationEntry.Metadata属性来查找FK属性名称,并将其用于Property方法。

类似这样的东西:

var entry = _context.Update(location);

var parentLocationProperty = entry.Property(
    entry.Reference(loc => loc.ParentLocation).Metadata.ForeignKey.Properties[0].Name
);
parentLocationProperty.CurrentValue = moveToParentLocation;

await _context.SaveChangesAsync();