Вопрос:

Как указать готовность загрузки с методом DBContext Find

c# asp.net-mvc entity-framework

2275 просмотра

4 ответа

1822 Репутация автора

Как мне сказать методу Find объекта DBContext, что он должен загружать свойство / сущность навигации?

У меня есть следующий код, который удаляет связь с соответствующим вторичным объектом:

Person primary = db.People.Find(Id);
if (primary == null)
  return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

// This line is required to load the related entity
db.Entry(primary).Reference("Secondary").Load();

primary.Secondary = null;
db.SaveChanges();

Я должен был добавить строку, db.Entry(primary).Reference("Secondary").Load();чтобы она заработала. Я понимаю, что это потому, что структура сущности использует ленивую загрузку. Могу ли я переопределить это в методе Find и избавиться от лишней строки, используя Eager версию метода Find?

Автор: Caltor Источник Размещён: 22.08.2016 09:16

Ответы (4)


-5 плюса

1187 Репутация автора

просто поменяй

Person primary = db.People.Find(Id);

в

Person primary = db.People.Find(Id).FirstOrDefault();
Автор: Hadee Размещён: 22.08.2016 09:20

1 плюс

396 Репутация автора

Или вы можете использовать

var result = db.Person.Include(c=>c.Secondary).FirstOrDefault(entity=>entity.Id == Id);

Используйте using System.Data.Entity;для возможности Linq в Включить, в противном случае вы можете просто использовать строку «Вторичный», например, так:.Include("Secondary")

Автор: Wurd Размещён: 22.08.2016 09:26

1 плюс

112 Репутация автора

Просто используйте метод Включить:

var result = db.Person.Include (c => c.Secondary) .FirstOrDefault (entity => entity.Id == Id);

Ссылка:

http://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx

Автор: RobsionKarls Размещён: 22.08.2016 09:34

10 плюса

83702 Репутация автора

Решение

Стремительная загрузка осуществляется Includeметодом:

db.People.Include(p => p.Secondary)

Который может следовать FirstOrDefault(p => p.Id == id), например.

Findэто DbSetметод, который сначала пытается найти запрошенную сущность в кеше контекста. Только когда он там не найден, объект извлекается из базы данных.

Из-за этого особого поведения (из Find) Includeи Findне могут быть смешаны. Было бы трудно определить, что делать, когда корневая сущность найдена в кеше, но включаемые сущности отсутствуют (или только частично). Должны ли они быть получены из базы данных? Это означало бы , что Find+ Includeбудет всегда должны запросить базу данных для включенных лиц, поскольку он не может полагаться на локальный кэш , чтобы быть полным. Это победит цель Find. Или должны найти только включенные объекты из локального кэша, если корневой объект находится в локальном кэше? Это сделало бы результат метода неоднозначным.

В ASP.Net MVC (или Web API) методы действий Findвряд ли когда-либо будут полезны, потому что в большинстве случаев будет создаваться новый контекст, и объекты будут выбираться из базы данных один раз. Другими словами, в кеше ничего нет. Возможно, вы захотите использовать метод для его краткости, но эффект, касающийся обходов базы данных, такой же, как FirstOrDefault().

Автор: Gert Arnold Размещён: 23.08.2016 07:51
Вопросы из категории :
32x32