EF Отложенная загрузка: добавление элемента в свойство навигации без его загрузки

#c# #entity-framework #linq-to-sql

#c# #entity-framework #linq-to-sql

Вопрос:

Предположим, что следующая модель данных:

 class Garden
{
    int ID;
    ICollection<Tree> Trees;
    string Address;
}
class Tree
{
    public int ID;
    public float Size;
}
  

Давайте посадим несколько деревьев:

 var gardens = dbContext.Gardens.Take(10).ToList();
foreach (var g in gardens)
    g.Trees.Add(new Tree());
  

Но теперь каждая ссылка на g.Trees запускает запрос к базе данных из-за отложенной загрузки. Я мог бы сделать .Include(garden => garden.Trees) при извлечении садов, но тогда я переношу все существующие деревья.

Я мог бы создать столбец GardenID в Tree, а затем просто добавить Дерево в мой DbContext, не касаясь свойства навигации. Но теперь мне нужно передать мой DbContext по кругу.

Как я могу добавить дерево в сад, не вызывая отложенную загрузку свойства навигации и не передавая ненужные данные?

Комментарии:

1. Либо сделайте Trees свойство невиртуальным, либо отключите dbContext отложенную загрузку.

2. Есть ли у вас навигация по саду в Tree классе.

Ответ №1:

Если вы сначала используете DB, то единственный вариант — отключить отложенную загрузку для всего контекста. ctx.Configuration.LazyLoadingEnabled = false

Если сначала используете код, убедитесь, что у вас есть пометка ICollection<Tree> Trees is not virtual , которая затем отключает отложенную загрузку только для этой коллекции.