Entity Framework Core - Как включить / заполнить свойство навигации пользовательским (1-к-1) запросом в EF? - PullRequest
0 голосов
/ 19 сентября 2018

Как включить / заполнить свойство навигации с помощью пользовательского (1-к-1) запроса в EF?

например

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

     [ForeignKey("Id")]
     public ItemCost LatestCost {get; set; }
}

public class ItemCost {
    public int Id { get; set; }
    public DateTime From { get; set; }
    public DateTime? To { get; set; }
    public decimal Cost { get; set; }
}

Цель состоит в заполнении свойства LatestCost элементас его последней стоимостью от ItemCosts.Как это достигается с помощью EF или как вы к этому относитесь?

Можно ли выполнить собственный запрос в методах .Include / .ThenInclude?например,

.ThenInclude(a => { a.LatestCost = (from a _db.ItemCosts 
                                    where... select a).SingleOrDefault() })...

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете использовать виртуальное свойство только для получения.Ваше свойство nav должно быть действительно ICollection<ItemCost>.В этом примере я предполагаю, что свойство Id в классе ItemCost является идентификатором связанного Item, но это не ясно.Совет: использование nameof(property) вместо жесткого кодирования имени свойства позволит компилятору отлавливать ошибки с именем, если вы по какой-либо причине изменили его.Атрибут [NotMapped] указывает Entity Framework не пытаться отображать свойство в поле базы данных.

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

    public ICollection<ItemCost> ItemCosts {get; set; }

    [NotMapped]
    public virtual ItemCost LatestCost
    {
        get
        {
            return ItemCosts.OrderByDescending(x => x.From).FirstOrDefault();
        }
    }
}

public class ItemCost {
    public int Id { get; set; }
    public DateTime From { get; set; }
    public DateTime? To { get; set; }
    public decimal Cost { get; set; }

    [ForeignKey(nameof(Id))]
    public virtual Item Item { get; set; }
}
...