Получение максимальной отдачи от Entity Framework в веб-приложении ASP MVC - PullRequest
0 голосов
/ 08 апреля 2011

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

1 Ответ

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

Не хранить 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, как обсуждено здесь , либо отслеживание изменений вручную, как описано здесь . Простые обновления отношений в Связывание с внешним ключом (описание остается тем же, даже если вы не используете code-first) все еще может обрабатываться предыдущими примерами.

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