Присоединенные объекты против отдельных объектов в entity framework

#asp.net-mvc #wcf #entity-framework

#asp.net-mvc #wcf #entity-framework

Вопрос:

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

Что я сейчас делаю в своем репозитории, так это вручную отсоединяю свои объекты перед их обновлением или удалением. Поэтому, если я обновляю или удаляю, я не выполняю цикл туда и обратно, а удаляю по идентификатору. Я думаю, что работа с отсоединенным сценарием работает для меня. Я делаю что-то не так?

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

Комментарии:

1. Отправляете ли вы объекты по проводам? Вы в значительной степени гарантированно будете использовать отсоединенные и присоединенные объекты, использующие EF в вашем сценарии. Даже одноуровневое веб-приложение в какой-то момент будет иметь отсоединенные объекты. Можете ли вы прояснить вопрос?

Ответ №1:

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

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

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

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

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

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

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

Комментарии:

1. Есть ли какой-либо способ отложить загрузку отсоединенных объектов?

2. «это позволяет быстрее считывать и проще материализовывать объекты» — я не думаю, что это правда. Можете ли вы объяснить?

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

4. Я думаю, что здесь мы говорим о наносекундах. Причина, по которой я что-либо говорю, заключается в том, что, когда вы говорите «быстрее», множество разработчиков сходят с ума, пытаясь оптимизировать свое приложение. То, как вы сформулировали свои преимущества отсоединенных объектов, создает впечатление, что повышение производительности при их использовании действительно имеет значение, хотя на самом деле это не так.

5. @jfar — Я сталкивался с ситуациями, когда отключение и отсоединенные объекты действительно имели огромное значение. Разница не будет заметна с небольшими наборами результатов или простыми объектами, возвращаемыми наборами результатов. Но когда у вас есть объекты с большим количеством загруженных свойств и навигационных свойств, это будет иметь значение.

Ответ №2:

 entity.User.Attach(model);
entity.ObjectStateManager.ChangeObjectState(model,System.Data.EntityState.Modified);
entity.SaveChanges();
return View(model);