如何在我的ASP MVC3 Web应用程序中充分利用我的Entity Framework(v4.0或更高版本)?我的主要问题是由于Web的请求 - 响应性质,似乎我必须手动跟踪表单上显示的对象到DB以进行CUD操作。例如。正如Editing and Updating Entity Framework entity in ASP .NET MVC中所建议的那样,这看起来很糟糕。有没有办法在我的会话中保留我的上下文,以及EF如何为我做所有的工作?
答案 0 :(得分:2)
不要将ObjectContext
存储在会话中。为每个请求处理使用新上下文。在这里,您可以阅读有关long living contexts的内容。如果您使用存储在会话中的长生活上下文,则加载新数据将会遇到很大问题。此外,如果您的用户在多个浏览器选项卡中打开您的应用程序(=同一会话),您可能会得到一些非常意外的结果。
如果您只想更新标量值(导航属性没有变化),您可以使用:
插入方案:
[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();
}
...
}
首先从DB中加载对象更新方案:
[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
讨论here或按照here手动跟踪更改。 Foreign key association上的简单关系更新(即使您不使用代码优先,描述也相同)仍然可以通过前面的示例处理。