Entity Framework 4 очень медленно связывает заказ с клиентом, у которого есть 10 000 заказов - PullRequest
4 голосов
/ 17 июня 2011

Это меня поставило в тупик.

У меня есть объект Customer и Order. Клиент может иметь много заказов.

Если у Клиента есть 10000 заказов, когда я создаю новый Заказ и устанавливаю свойство Клиента (Order.Customer = customer), происходит ДЛИТЕЛЬНАЯ задержка (20 секунд). Похоже, что контекст загружает все 10 000 заказов перед добавлением этого нового.

В настоящее время я не использую FK напрямую, что, как я подозреваю, может помочь.

Есть идеи, как мне улучшить ситуацию без масштабного рефакторинга?

Приветствие.

Ответы [ 2 ]

9 голосов
/ 17 июня 2011

Скорее всего, проблема в том, что вы используете шаблон P4O T4. Этот шаблон генерирует неприятные методы исправления и использует их внутренне во всех свойствах навигации. Если вы измените свойство навигации с одной стороны, это вызовет исправление, которое попытается изменить свойство обратной навигации, чтобы сделать граф объекта согласованным. И тут возникает проблема. Как только вы назначите свойство Customer для экземпляра Order, оно исправит свойство Orders для экземпляра Customer, но исправит свойство доступа, как и любой другой код, и инициирует отложенную загрузку всех заказов клиентов.

Есть только несколько решений:

  • Использовать связь с внешним ключом и установить свойство FK. Это должно работать для вставок, но для обновления это все еще может вызвать проблемы, потому что установка свойства FK в другое значение установит null в свойство навигации и это снова вызовет исправление для предыдущего родителя.
  • Отключите отложенную загрузку для этой операции - вам, скорее всего, она не понадобится для создания нового заказа.
  • Изменить шаблон и удалить исправления
1 голос
/ 17 июня 2011

Может быть, другой подход может сработать.Если у вас есть экземпляр клиента, попробуйте:

customer.Orders.Add(new Order(){parameter1 = value1, parameter2=valu2, etc.})

Я сейчас не @work, поэтому не нужно иметь никакого кода вручную для проверки структуры сущностей (работа с сущностями самообследования для проекта), чтобы увидеть,это имеет смысл.Но, добавив его в коллекцию заказов, организация может разрешить связь между заказом и клиентом, не получая все остальные 10 тыс. Заказов этого конкретного клиента.

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