Присоединенные объекты против Отдельных объектов в рамках сущности - PullRequest
2 голосов
/ 08 апреля 2011

Каковы преимущества использования прикрепленных объектов по сравнению с отключенными объектами?

В настоящее время я делаю в своем хранилище вручную отсоединение своих объектов перед их обновлением или удалением.Поэтому, если я обновляю или удаляю, я не делаю туда-обратно, а удаляю по ID.Я думаю, что работа с отдельным сценарием работает для меня.Я что-то не так делаю?

Я работаю с приложением n-teir, которое использует asp.net mvc и wcf.

Ответы [ 2 ]

5 голосов
/ 08 апреля 2011

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

Использование отдельных объектов отлично! это позволяет быстрее читать, материализовать более простые объекты, уменьшить объем памяти для контекста объекта. Также лучше всего при отправке данных по проводам (wcf .. services). Все, что выходит за рамки или даже когда вы конвертируете объекты в объекты домена. Поскольку вам не требуется никакого отслеживания объектов, для начала это хорошая оптимизация. Это может быть быстро достигнуто с помощью опции слияния NoTracking в наборе сущностей.

Отдельные объекты также значительно упростят работу с EF в средах, где у вас есть много экземпляров вашего контекста. Просто прикрепите объект перед внесением изменений и сохранением.

Примечание: использование NoTracking не позволит вам использовать отложенную загрузку, отслеживание изменений, GetObjectByKey или любую из функциональных возможностей структуры сущностей. При использовании NoTracking вам нужно будет использовать готовую загрузку («Включить ()») для загрузки связанных объектов / навигационных свойств. EntityKeys также не будет загружен.

Редактировать:

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

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

1 голос
/ 11 августа 2011
entity.User.Attach(model);
entity.ObjectStateManager.ChangeObjectState(model,System.Data.EntityState.Modified);
entity.SaveChanges();
return View(model);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...