我正在尝试使用EF4更新对象。对象从强类型页面传递到操作方法和
[HttpPost]
public ActionResult Index(Scenario scenario, Person person)
{
// Some business logic.
// Update Scenario with Person information.
scenario.Person = person;
// Update the corresponding object and persist the changes.
// Note that the repository stems from the repository pattern. Contains the ObjectContext.
Scenario updateScenario = repository.GetScenario(scenario.ScenarioID);
updateScenario = scenario;
repository.Save();
}
然而,问题是当我这样做时,更改不会持续存在。但是,如果我改为单独更新场景中的每个属性,然后保留更改(通过Save方法),则所有内容都会保留。
我很困惑为什么会这样。在我的实际应用程序中,场景中有许多项目和子对象,因此更新每个单独的属性是不可行的。有人可以帮助清理正在发生的事情以及我需要做些什么来解决它?
答案 0 :(得分:3)
在action方法的上下文中,您有两个Scenario类型的不同对象。场景指向其中一个对象,updateScenario指向另一个对象。使用代码行:
updateScenario = scenario
您所做的只是使updateScenario指向场景所指向的同一对象,而不是将组成对象的值从一个复制到另一个。实际上,您的数据库上下文只能识别2个Scenario实例中的1个。方案的另一个实例是在上下文之外创建的,并且上下文尚未意识到它。
在您的特定方案中,您可以通过不在参数上使用方案来完成所需的操作,而是从数据库上下文和操作方法中提取要更新的方案,调用:
this.TryUpdateModel(updateScenario);
这将导致模型绑定器更新数据库上下文知道的Scenario对象上的属性/字段,因此在您调用Save()
时将保留更改。
HTH