Nano Hash - криптовалюты, майнинг, программирование

Как я могу использовать Entity Framework для поиска только в магазине, а не в локальных данных?

Я использую EF 4.1 и все еще пытаюсь выяснить некоторые детали. У меня есть родительские (один)-дочерние (многие) отношения в базе данных. Объект EF, представляющий этот дочерний элемент, имеет свойство, представляющее одного родителя. Я явно устанавливаю поле child.parentId FK, а затем могу сделать context.Add(child), за которым следует context.SaveChanges(), и дочерняя запись с правильным родительским внешним ключом появляется в базе данных. Все хорошо, что касается БД.

Однако, хотя дочерний объект в памяти корректно обновляется такими вещами, как столбец идентификации PK, поле родительского свойства остается пустым. Меня это удивило, это нормально? Как только запись создана и я возвращаюсь в приложение, навигация к родителю всегда работает. Просто кажется, что сразу после создания дочернего элемента родительское свойство навигации не обновляется.

Я подумал, что, возможно, тогда я мог бы просто найти контекст для только что созданного дочернего элемента на основе возвращенного PK и получить полностью заполненный дочерний объект, но это не работает. Кажется, я просто возвращаю идентичный объект. Я думаю, что это просто поиск в локальном кеше и возврат объекта, который у меня уже есть. Я заметил, что context.Child.Local кажется способом взглянуть только на локальное представление, но я не видел аналога «магазина».

16.11.2011

  • Либо удалите контекст после SaveChanges, либо каждый раз создавайте новый экземпляр, либо отсоедините объект после сохранения. 16.11.2011
  • Ответ Кирка решил мою насущную проблему, но из комментариев следует, что я не могу делать то, что хочу, хотя я могу просто создать новый контекст (даже оставив текущий контекст открытым) и искать таким образом. Конечно, как я понял, мне нужно быть очень осторожным с тем, что я делаю с чем-либо, возвращенным из отдельного контекста. 16.11.2011

Ответы:


1

Вместо установки значения ключа вы должны установить значение свойства навигации (и ссылку на объект). Например

Child child = GetChildFromSomewhere();
Parent parent = GetParentFromSomewhere();

// Don't do this
child.ParentId = parent.ParentId;

// Use this instead
child.Parent = parent;

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

Если вы измените ключ напрямую, ссылка на объект не будет автоматически обновлена ​​(контекст не будет искать соответствующий родительский элемент и добавлять ссылку, пока вы не сохраните или не выполните повторную синхронизацию с базой данных).

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

16.11.2011
  • Да, спасибо (вставьте смайлик для пощечины). Я должен отучиться от своих старых привычек. Сначала, когда я попробовал это, я получил ошибки о нарушениях уникальных ключей для родителя. Я понял, что это означает, что выполнение child.Parent = parent вставляло Parent, не связанного с существующим. Затем я понял, что у меня был родительский объект из другого контекста, чем тот, в котором я создавал дочерний объект. Поэтому я просто сделал context.Find(parent.Id), чтобы получить родителя в текущем контексте, и это сработало. 16.11.2011

  • 2

    Ваш ПК не будет правильно установлен, пока вы не создадите новый контекст. Вы должны удалять и воссоздавать свой контекст после каждого SaveChange().

    16.11.2011
  • Два комментария: первый, спасибо за совет по удалению после SaveChanges(). Я отслеживаю контекст, чтобы свести к минимуму круговые обходы базы данных, но я не закрываю/не воссоздаю, и я не думал об этом, пока вы не упомянули об этом. Во-вторых, у меня нет проблем с ПК. Хотя я точно не знаю, что вы подразумеваете под правильно установленным, EF отлично справляется с работой, позволяя мне работать с (временным) ПК и назначать его связанным записям (что, как я узнаю, мне, вероятно, не нужно делать) и хотя PK не является реальным до SaveChanges(), он корректно обновляет все во всех связанных таблицах после сохранения. 16.11.2011

  • 3

    Пробовали ли вы добавить дочерний объект непосредственно в дочернюю коллекцию EntityCollection родительского объекта, а не в Context ObjectSet? Это также добавит его в Context ObjectSet, поэтому вы избежите проблемы с самого начала.

    16.11.2011
  • Спасибо, это также будет работать, как предложение Кирка, но этот конкретный фрагмент кода ориентирован на ребенка, поэтому выполнение его способом Кирка кажется немного чище. 16.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..