2011-01-19 2 views
1

Я пытаюсь обновить объект, используя 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

Как вы знаете, что изменения сохраняются только при глубокой копии? Я имею в виду, как вы это проверяете, на уровне db? Кроме того, есть ли какие-либо другие методы 'Save' в' repository', что-то вроде 'SaveOrUpdate'? – VoodooChild

+0

@ VoodooChild - Да, я подтверждаю это на уровне базы данных. И я на самом деле написал репозиторий. Сохранить в основном просто вызывает объекты .SaveChanges(), где сущности - это контекст для структуры сущности. – JasCav

ответ

3

В контексте вашего метода действий у вас есть два разных объекта типа Scenario. сценарий указывает на один из объектов, а updateScenario указывает на другой. С строки кода:

updateScenario = scenario 

Все, что вы делаете, вызвавшего updateScenario, чтобы указать на тот же объект, который указывает сценарий, вы не копируете значения, которые составляют объект от одного к другому. По сути, ваш контекст базы данных знает только один из двух экземпляров сценария. Другой экземпляр сценария был создан вне контекста, и контекст не был осведомлен об этом.

В вашем конкретном случае вы можете сделать то, что вы хотите, не принимая сценарий на свой параметр, и вместо этого, тянуть сценарий, который вы хотите обновить из вашего контекста базы данных и в методе действия, вызовите:

this.TryUpdateModel(updateScenario); 

Это приведет к тому, что связующее устройство будет обновлять свойства/поля объекта Scenario, о котором знает ваш контекст базы данных, и, следовательно, будет сохраняться в тех случаях, когда вы вызываете Save().

HTH

+0

О, ничего себе. Ранее я использовал TryUpdateModel (updateScenario) в своем коде. Как только вы дали свой ответ, я взглянул на код и понял, что у меня это в неправильном месте. Перемещено, и все работает. +1 и принять. Спасибо. Глупые ошибки FTL. – JasCav

Смежные вопросы