Не хранить 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) все еще может обрабатываться предыдущими примерами.