EF Core обновляет свойство навигации, но скрытое свойство FK не обновляется - PullRequest
1 голос
/ 08 марта 2019
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 Ответ

2 голосов
/ 08 марта 2019

Дизайн вашего метода требует установки свойства shadow 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...