Entity Framework: повторный поиск объектов, недавно добавленных в контекст

entity-framework

Вопрос

Я использую структуру сущностей, и у меня возникла проблема с "повторным поиском" объектов, которые я только что создал ... в основном это выглядит так:

string theId = "someId";

private void Test()
{
  using(MyEntities entities = new MyEntities())
  {
    EntityObject o = new EntityObject();
    o.Id = theId;
    entities.AddToEntityObject(o);
    CallSomeOtherMethod(entities);
  }
}

void CallSomeOtherMethod(MyEntities ents)
{
  EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId);
  if(search == null) 
  {
    Console.WriteLine("wha happened???");
  }
}

(нет гарантии, что код работает, кстати - это все из моей головы)

Почему запрос не «находит» объект EntityObject, который был только что создан?

Если я вызываю SaveChanges () после AddToEntityObject, он работает (что меня не удивляет), но почему он не вытягивает из кеша должным образом?

Я все еще зелен в этом, так что я надеюсь, что есть кое-что действительно простое, что я просто упускаю из виду ...

Спасибо

Принятый ответ

Это происходит потому, что ents.EntityObject.WhatEver всегда запрашивает источник данных. Это дизайнерское решение. Они делают это таким образом, потому что иначе им придется выполнить запрос к источнику данных, к локальному кешу, а затем объединить результаты. Как отметил один из разработчиков в блоге (не могу вспомнить, где именно), они не смогли справиться с этим последовательно.

Как вы можете себе представить, есть много угловых случаев, с которыми вы должны обращаться правильно. Вы можете просто найти идентификатор, который вы создали локально, созданный кем-то еще в базе данных. Это заставит вас быть готовым к обработке конфликтов (почти) на каждый запрос. Возможно, они могли бы создать методы для запроса локального кэша и методы для запроса источника данных, но это не слишком умно.

Вы можете взглянуть на прозрачную ленивую загрузку для Entity Framework . Это заменяет обычный генератор кода, и вы получаете сущности, которые автоматически заполняют связанные коллекции сущностей и ссылки на сущности при доступе. Это позволяет избежать всего

if (!Entity.ReleatedEntities.IsLoaded)
{
   Entity.RelatedEntities.Load();
}

фрагменты кода. И вы можете запросить коллекции, потому что они всегда загружаются неявно. Но и это решение не идеально. Есть некоторые проблемы. Например, если вы создаете новую сущность и получаете доступ к коллекции связанных сущностей, вы получите исключение, потому что код не может извлечь связанные сущности из базы данных. Существует также проблема, связанная с привязкой данных, и, возможно, я еще не знаю об этом.

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


Популярные ответы

Недавно добавленный объект находится в локальном источнике данных, так как он еще не сохранен в базе данных, поэтому вы можете сказать EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow