Почему мои свойства навигации пусты в Entity Framework 4? - PullRequest
2 голосов
/ 10 октября 2010

Код:

public ChatMessage[] GetAllMessages(int chatRoomId)
{
  using (ChatModelContainer context = new ChatModelContainer(CS))
  {
    //var temp = context.ChatMessages.ToArray();
    ChatRoom cr = context.ChatRooms.FirstOrDefault(c => c.Id == chatRoomId);
    if (cr == null) return null;
    return cr.ChatMessages.ToArray();
  }
}

Проблема:

Метод (часть службы WCF) возвращает пустой массив.Если я раскомментирую закомментированную строку, она начнет работать как положено.Я попытался включить отложенную загрузку, но это не помогло.

Кроме того, когда это работает, я получаю сообщения ChatMessages со ссылкой на заполненный ChatRoom, но не ChatParticipant.На них ссылается объект ChatMessage в схеме с идентификаторами и свойствами навигации.Идентификаторы установлены и указывают на нужные объекты, но на стороне клиента заполнена только ссылка ChatRoom.

Вопросы, связанные с данной:

  1. Является ли массив предпочтительным методом длявернуть коллекции EF-сущностей, как это?
  2. При внесении изменений в мою модель (edmx) мне необходимо запустить опцию «Создать базу данных из модели ...», прежде чем я смогу запустить context.CreateDatabase (),Зачем?Я получаю сообщение об ошибке, указывающее на старый SSDL, но не могу найти, где хранится SSDL.Создается ли это, когда я запускаю эту опцию «Сгенерировать базу данных ...»?
  3. Безопасно ли возвращать клиенту целые графы сущностей?Я читал кое-что о «исключениях из циклических ссылок», но исправлено ли это в EF4?
  4. Как и когда заполнены ссылки в EF4?Если у меня включена отложенная загрузка, я подозреваю, что заполняются только объекты, к которым я прикасаюсь?Но с отключенной отложенной загрузкой, должен ли тогда всегда заполняться весь график?
  5. Есть ли недостатки в использовании самообновляющихся сущностей над обычными сущностями в EF4?Мне не нужно самообновление прямо сейчас, но я могу сделать позже.Могу ли я легко обновиться или я должен начать с самообновления с самого начала?
  6. Почему я не могу использовать ключи сущностей с типом string?

1 Ответ

8 голосов
/ 11 октября 2010

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

Прежде всего, в приведенном вами примере кода вы получаете объект ChatRoom, а затем попробуйтечтобы получить доступ к связанному объекту, который не включен в ваш запрос (ChatMessages).Если отложенная загрузка отключена, как вы предлагали, тогда вам потребуется вызов Include ("ChatMessages") в запросе, поэтому ваш запрос LINQ должен выглядеть следующим образом:

ChatRoom cr = context.ChatRooms.Include("ChatMessages").FirstOrDefault(c => c.Id == chatRoomId);

Пожалуйста, убедитесь, что ваша строка подключения находится в вашем конфигурационном файле.

По связанным вопросам:

  1. Вы можете вернуть коллекции любым способом, который вы выберете - у меня естьобычно это делается в объекте List (и я думаю, что это распространенный способ), но вы можете использовать массивы, если хотите.Чтобы вернуться в виде списка, используйте вызов метода .ToList () для вашего запроса.

  2. Я не понимаю, что вы пытаетесь сделать здесь, вы используете код для созданияваша база данных из вашего файла EDMX или что-то?Обычно я использовал подход, основанный на базе данных, поэтому я создаю свои таблицы и т. Д., А затем обновляю свой EDMX из базы данных.Даже если вы генерируете свою БД из своей модели, вам не нужно запускать CreateDatabase в коде, вы должны быть в состоянии запустить сгенерированный скрипт для вашей БД.Если вы используете только код, то вам нужно выгрузить файл EDMX.

  3. Как правило, вы можете возвращать графы сущностей клиенту, должны обрабатываться нормально.

  4. EF4 должен заполнять только то, что вам нужно.Если вы используете отложенную загрузку, он автоматически загружает вещи, которые вы не включили в ваш запрос LINQ, когда вы ссылаетесь на них и выполняете запрос (например, выполняете операцию ToList ()).Это не будет работать так хорошо, если ваш клиент пересекает физическую границу (например, границу службы), очевидно :) Если вы не используете отложенную загрузку, он загрузит то, о чем вы говорите, в своем запросе, и это все.

  5. Самообследуемые объекты используются для n-уровневых приложений, где объекты должны передаваться через физические границы (например, службы).Они идут с накладными расходами сгенерированного кода для каждого объекта, чтобы отслеживать его изменения, они также генерируют объекты POCO, которые не зависят от EF4 (но, очевидно, содержат сгенерированный код, который заставил бы отслеживаемые изменения работать с трекером EF4).Я бы сказал, что это зависит от вашего использования, если вы создаете небольшое автономное приложение и не заботитесь о разделении для тестируемости без инфраструктуры, тогда вам не нужно использовать самосопровождающие объекты,Я говорю, что используйте фреймворк только тогда, когда он вам нужен, поэтому, если вы не пишете приложение масштаба предприятия (предприятие не должно быть крупным, а что-то масштабируемым, хорошо тестируемым, высококачественным и т. Д.), Тогда вам не нужно искать себяотслеживание POCO.

  6. Я не пробовал, но вы должны были бы сделать это - это было бы кандидатом на отдельный вопрос, если вы не можете заставить его работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...