Entity framework 为什么更新对象只能以一种特定的方式工作?

Entity framework 为什么更新对象只能以一种特定的方式工作?,entity-framework,asp.net-mvc-2,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 obj

我正在尝试使用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方法),那么所有内容都将被保存


我不明白为什么会这样。在我的实际应用程序中,场景中有许多项和子对象,因此不可能更新每个单独的属性。有人能帮我弄清楚发生了什么以及我需要做什么来修复它吗?

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

updateScenario = scenario
您所做的只是使updateScenario指向场景所指向的同一个对象,而不是将组成该对象的值从一个复制到另一个。基本上,您的数据库上下文只知道场景的2个实例中的1个。场景的另一个实例是在上下文之外创建的,上下文尚未意识到它

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

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


HTH

您如何知道只有在执行深度复制时更改才会持续?我的意思是,你如何在db级别验证它?另外,在
repository
上是否有类似
SaveOrUpdate
Save
方法?@VoodooChild-是的,我正在数据库级别确认。实际上,我编写了存储库。Save基本上只调用entities.SaveChanges(),其中entities是实体框架的上下文。我在代码的前面做了TryUpdateModel(updateScenario)。一旦你给出了答案,我看了代码一眼,意识到我把它放错地方了。移动它,一切正常+1和接受。非常感谢。愚蠢的错误。