为什么更新对象只能以一种方式工作?

时间:2011-01-19 02:58:58

标签: entity-framework asp.net-mvc-2

我正在尝试使用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方法),则所有内容都会保留。

我很困惑为什么会这样。在我的实际应用程序中,场景中有许多项目和子对象,因此更新每个单独的属性是不可行的。有人可以帮助清理正在发生的事情以及我需要做些什么来解决它?

1 个答案:

答案 0 :(得分:3)

在action方法的上下文中,您有两个Scenario类型的不同对象。场景指向其中一个对象,updateScenario指向另一个对象。使用代码行:

updateScenario = scenario

您所做的只是使updateScenario指向场景所指向的同一对象,而不是将组成对象的值从一个复制到另一个。实际上,您的数据库上下文只能识别2个Scenario实例中的1个。方案的另一个实例是在上下文之外创建的,并且上下文尚未意识到它。

在您的特定方案中,您可以通过不在参数上使用方案来完成所需的操作,而是从数据库上下文和操作方法中提取要更新的方案,调用:

this.TryUpdateModel(updateScenario);

这将导致模型绑定器更新数据库上下文知道的Scenario对象上的属性/字段,因此在您调用Save()时将保留更改。

HTH