Arhn - архитектура программирования

Получение максимальной отдачи от Entity Framework в веб-приложении ASP MVC

Как максимально эффективно использовать Entity Framework (v4.0 или выше) в веб-приложении ASP MVC3? Моя основная проблема связана с характером веб-запроса-ответа, кажется, мне нужно вручную отслеживать объекты, отображаемые в форме, в БД, чтобы выполнять операции CUD. Например. как предлагается в Редактирование и обновление сущности Entity Framework в ASP. NET MVC, это кажется ужасно ручным. Есть ли способ сохранить мой контекст в моем сеансе так, чтобы EF выполняла всю работу за меня?


Ответы:


1

Не храните ObjectContext в сеансе. Используйте новый контекст для обработки каждого запроса. Здесь вы можете прочитать кое-что о долгоживущих контекстах. Если вы используете долгоживущий контекст, хранящийся в сеансе, у вас будет большая проблема с загрузкой свежих данных. Также, если ваш пользователь откроет ваше приложение на нескольких вкладках браузера (= один и тот же сеанс), вы можете получить очень неожиданные результаты.

Если вы хотите обновить только скалярные значения (без изменений в свойствах навигации), вы можете использовать:

Вставить сценарий:

[HttpPost]
public ActionResult Insert(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.AddObject(entity);
        context.SaveChanges(); 
    }

    ...
}

Сценарий обновления с полностью отсоединенным объектом:

[HttpPost]
public ActionResult Update(MyEntity entity)
{
    using (var context = new MyContext())
    {
        context.MyEntities.Attach(entity);
        context.ObjectStateManager.ChangeObjecState(entity, EntityState.Modified);
        context.SaveChanges(); 
    }

    ...
}

Сценарий обновления с загрузкой объекта сначала из БД:

[HttpPost]
public ActionResult Update(MyEntity entity)
{
    using (var context = new MyContext())
    {
        int id = entity.Id;
        context.MyEntities.Single(e => e.Id == id); // You must load the record first
        context.MyEntities.ApplyCurrentValues(entity);
        context.SaveChanges(); 
    }

    ...
}

Удалить сценарий:

[HttpPost]
public ActionResult Delete(int id)
{
    using (var context = new MyContext())
    {
        var entity = context.MyEntities.Single(e => e.Id == id);
        context.MyEntities.DeleteObject(entity);
        context.SaveChanges(); 
    }

    ...
}

Можно удалить объект, не загружая его предварительно, но если объект имеет какое-либо отношение, это создает много проблем.

Если вы хотите изменить отношения, это может включать использование либо UpdateMode / TryUpdateModel, как обсуждалось здесь или отслеживание изменений вручную, как описано здесь. Простые обновления отношения к ассоциации внешнего ключа ( описание такое же, даже если вы не используете код сначала), с предыдущими примерами все еще можно справиться.

07.04.2011
  • Как выбрать между использованием сценария обновления с полностью отсоединенным объектом и сценарием обновления с загрузкой объекта сначала из БД? Кажется, все, что мне нужно сделать, это установить флаг IsNew на моих объектах, чтобы определить, следует ли мне использовать .Add () или ApplyCurrentValues ​​() для каждого объекта. 08.04.2011
  • Все зависит от ваших предпочтений. Сценарий с загрузкой объектной формы БД требует дополнительного обращения к базе данных, но работает в любом случае. В отдельном сценарии могут возникнуть серьезные проблемы при изменении объекта и независимой ассоциации. 08.04.2011
  • В EF4 лучше использовать find () вместо single или first для загрузки текущего объекта (в основном find () = tryupdatemodel) 08.04.2011
  • @ashraf: насколько я знаю, Find доступен только в DbContext API = EF 4.1. Тот же метод существует в EFv4 и называется GetObjectByKey, но вы должны передать ключ объекта в качестве параметра, что не так просто с POCO. Вот пример: stackoverflow.com/questions/5273416/ 08.04.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..