4

Я создаю веб-сайт MVC 3. У меня есть модель, глядя, как это:Entity Framework: ViewModel to Domain Model

public class Survey 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public DateTime DateStart { get; set; } 

    public DateTime DateEnd { get; set; } 

    // Not in view 
    public DateTime DateCreated { get; set; } 

    // Not in view 
    public DateTime DateModified { get; set; } 
} 

Основываясь на этом я также Модельное редактировать информацию опроса:

public class SurveyEditViewModel 
{ 
    public Guid Id { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public DateTime DateStart { get; set; } 

    public DateTime DateEnd { get; set; } 
} 

Когда пользователь заканчивает редактирование Я хотел бы сохранения изменений. Вот мой контроллер после действия:

[HttpPost] 
    public ActionResult Edit(SurveyEditViewModel model) 
    { 
     // Map the view model to a domain model using AutoMapper 
     Survey survey = Mapper.Map<SurveyEditViewModel, Survey>(model); 

     // Update the changes 
     _repository.Update(survey); 

     // Return to the overview page 
     return RedirectToAction("Index"); 
    } 

В моем хранилище (это родовое один сейчас) у меня есть следующий код:

public void Update(E entity) 
    { 
     using (ABCDataContext context = new ABCDataContext()) 
     { 
      context.Entry(entity).State = System.Data.EntityState.Modified; 
      context.SaveChanges(); 
     } 
    } 

Когда выполняется я получаю следующее сообщение об ошибке: «обновление магазина , вставка или удаление повлияли на неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. Обновить записи ObjectStateManager. "

Я предполагаю, что этого следовало ожидать. Отображение из модели представления модели не дает мне полного объекта Survey.

Я мог бы изменить свой контроллер таким образом. И затем это работает:

[HttpPost] 
public ActionResult Edit(SurveyEditViewModel model) 
{ 

    // Map the model to a real survey 
    survey = _repository.Find(model.Id); 
    survey.Name = model.Name; 
    survey.Description = model.Description; 
    survey.DateStart = model.DateStart; 
    survey.DateEnd = model.DateEnd; 

    // Update the changes 
    _repository.Update(survey); 

    // Return to the overview page 
    return RedirectToAction("Index"); 
} 

Но мне было интересно, доступен ли лучший способ?

ответ

12
[HttpPost] 
public ActionResult Edit(SurveyEditViewModel model) 
{ 
    // Fetch the domain model to update 
    var survey = _repository.Find(model.Id); 

    // Map only the properties that are present in the view model 
    // and keep the other domain properties intact 
    Mapper.Map<SurveyEditViewModel, Survey>(model, survey); 

    // Update the changes 
    _repository.Update(survey); 

    // Return to the overview page 
    return RedirectToAction("Index"); 
} 
+0

Отлично! Я отмечу это как ответ. – Aetherix

+0

@DarinDimitrov Если я следую этому примеру, мой сундук должен отключить отслеживание изменений? Думаю, у меня будет много проблем, если я включу его. – MuriloKunze