MVC Updatemodel и Linq-To-Sql создают новую сущность вместо обновления - PullRequest
4 голосов
/ 01 декабря 2009

У меня есть форма опроса со следующей иерархией данных

опрос -

Я использую updateModel для обновления сущности Survey в моем методе сохранения, который отлично работает для survey и surveyQuestions, однако surveyQuestionOptions отображается обновленным, когда я проверяю переменную updateSurvey в отладчике, но после вызова SubmitChanges я получаю новые записи surveyQuestionOption вместо обновлений. Мой код выглядит следующим образом

HTML

 <%= Html.TextBox("Survey.Id", Model.Id)%>
 <%= Html.TextBox("Survey.SurveyName", Model. SurveyName)%>

 <%= Html.TextBox("Survey.SurveyQuestions[0].Id", Model.Id)%>
 <%= Html.TextBox("Survey.SurveyQuestions[0].Question", Model. Question)%>

 <%= Html.TextBox("Survey.SurveyQuestions[0].SurveyQuestionOptions[0].Id", Model.Id)%>
 <%= Html.TextBox("Survey.SurveyQuestions[0].SurveyQuestionOptions[0].Option", Model. Option)%>

Контроллер

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Save(int? id, IList<ChannelForm> channelForms, FormCollection fc)
        {

            Survey updateSurvey = new Survey();

            //if this is an existing Surveyretrieve that record from the database ready for updating
            if (id != 0)
            {
                updateSurvey = surveynRepository.GetSingle(Convert.ToInt32(id));
            }

            try
            {
                // updateSurvey and all child elements
                UpdateModel(updateSurvey, "Survey");
                surveyRepository.Save();
return View();
    }catch
{return View();}

    }

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 01 декабря 2009

Ммм .. я не пытался обновить непосредственно такой дочерний элемент, особенно с помощью сложных моделей (различных уровней глубины). Я в основном использую ViewModel, а затем использую эту ViewModel для обновления фактической модели (классы LinqtoSQL).

Я бы обновил ребенка таким образом:

Получить текущий сохраненный опрос

currentSurvey = surveyRepository.GetSingle(Convert.ToInt32(id));


foreach (var option in updateSurveyViewModel.SurveyQuestions)
{
   //check if exist
   var current = currentSurvey.SingleOrDefault(a=> a.Id == option.Id);
   if (current == null)
   {
     //Create a NewOne and attach it to the curentSurvey
   }
    else
   {
    //already exist, Update the option
    current.Option = option.Option;
    //...
   }
   }

Я знаю, что это не уровень глубины проблемы, но та же концепция.

0 голосов
/ 23 декабря 2010

Я пытался использовать LoadOptions в LINQ to SQL:

var loadOptions = new System.Data.Linq.DataLoadOptions();
loadOptions.LoadWith<Contact>(c => c.ContactEmails);
db.LoadOptions = loadOptions;

Contact old = db.Contacts.SingleOrDefault(c => c.ContactID == id);
UpdateModel(old, "Contact");

db.SubmitChanges();

Не помогло. Все существующие ContactEmail будут удалены и вставлены снова.

0 голосов
/ 01 декабря 2009
 Survey updateSurvey;

 if (id == 0)
 {
     updateSurvey = new Survey();
 }
 else
 {
     updateSurvey = surveyRepository.GetSingle(Convert.ToInt32(id));
 }
 try
 {
   ..etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...