2013-02-13 4 views
0

Получаю эту странную «ошибку». Когда я запускаю свое приложение (обновляю действие i.e), я получаю повторяющиеся значения, хранящиеся в моем дБ. Если я использую отладчик, шаг за шагом, его работу (без дубликатов) ...Дубликаты во время выполнения MVC4 Entity Framework

Это отношение «многие ко многим», поэтому не мешайте значениям курса NULL в изображениях, просто пытаясь понять вещи ...

Вся помощь оценивается!

[HttpPost] 
    public ActionResult Edit(CourseStudentViewModel model) 
    { 
     var course = db.Courses 
      .Where(c => c.Id == model.CourseId) 
      .Single(); 

     if (ModelState.IsValid) 
     { 
      course.Name = model.CourseName; 
      course.Description = model.CourseDescription; 
      course.Students = model.Students; 

      if(course.Id != 0) { 
       db.Entry(course).State = System.Data.EntityState.Modified; 
      } 
      else { 
       db.Courses.Add(course); 
      } 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     //modelstate not valid, display form 
     return View(model); 
    } 

Я получаю ViewModel назад. Все хорошо. My view Model that i get back

Мои старые значения от дБ. Я хочу обновить эти данные. Так что все еще хорошо ...

enter image description here

Мои старые значения обновляются моим новым ценностям. Большой!

enter image description here


Ok все отлично работает, если я ступаю с отладчиком, как это. Но если я запустил приложение, я получу дубликаты ... Кто-нибудь?

Новое содержание:

My Edit ракурса

@model ValueInjecter.Web.Models.CourseStudentViewModel

@ { ViewBag.Title = "Edit"; }

Edit Course

@using (Html.BeginForm()) { @ Html.HiddenFor (с => Model.CourseId) @ Html.LabelFor (с => Model.CourseName) @ Html.EditorFor (с => Model.CourseName)

@Html.LabelFor(c => Model.CourseDescription) 
    @Html.EditorFor(c => Model.CourseDescription) 
</div> 

<hr /> 
<h2>Students</h2> 

<div class="editor-field"> 
    @for (int i = 0; i < Model.Students.Count(); i++) 
    { 
     <div style="border: dotted 1px; padding: 5px; margin: 10px;"> 
      @Html.HiddenFor(s => s.Students[i].Id) 

      @Html.LabelFor(s => s.Students[i].Name[i + 1]) 
      @Html.EditorFor(s => s.Students[i].Name) 
     </div> 
    } 
</div> 
<p> 
    Number of Students: 
<b>@Html.DisplayFor(s => Model.StudentCount)</b> 
</p> 
<hr /> 
<p> 
    <input type="submit" value="Save" /> 
</p> } 

ответ

0

Хорошо, я наконец выяснил решение моей проблемы. Конечно, гораздо легче, чем первая мысль.

[HttpPost]

public ActionResult Edit(CourseStudentViewModel model) 
    { 

     if (ModelState.IsValid) 
     { 
      var course = db.Courses.Find(model.CourseId); 
      course.Name = model.CourseName; 
      course.Description = model.CourseDescription; 

      if(model.Students != null) 
      { 
       foreach (var item in model.Students) 
       { 
        db.Entry(item).State = System.Data.EntityState.Modified; 
       } 
      } 

      if(course.Id != 0) { 
       db.Entry(course).State = System.Data.EntityState.Modified; 
      } 
      else { 
       db.Courses.Add(course); 
      } 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     //modelstate not valid, display form 
     return View(model); 
    } 

Тем не менее, используя вид ив вставили выше.

0

Это, вероятно, работает в отладчике, так как при осмотре course.Students коллекции в окне свойств часов вы вызываете фактически второй запрос к базе данных (после запроса, вот объявления course) из-за ленивая загрузка из коллекции Students. (Ваша Course.Students коллекция, скорее всего, объявлена ​​как virtual.) Если вы запускаете без отладчика, то нет никакой ленивой загрузки, а course.Students остается пустой.

Вы можете заставить что course.Students коллекция всегда загружается с помощью жадной загрузки вместо отложенной загрузки (который также сохраняет второй туда и обратно базы данных):

var course = db.Courses 
    .Include(c => c.Students) 
    .Where(c => c.Id == model.CourseId) 
    .Single(); 

Честно говоря, я понятия не имею, почему ваш код работает правильно с загруженной коллекцией (в отладчике) и почему она вообще работает. Присвоение полной отрывной коллекции следующим образом: course.Students = model.Students, а затем просто установить состояние родителя на Modified, как правило, недостаточно для обновления дочерней коллекции.

Но я вижу "ValueInjecter" на скриншотах. Может быть, есть какая-то автоматическая магия отображения, которая делает (случайно?) Правильную вещь, чтобы получить рабочее обновление.

+0

ОК Спасибо за ваш ответ. Моя коллекция (курс. Студенты) не пуста. Его дублируют. Старые значения из db и новые значения из пользовательского интерфейса (текстовые поля). Я добавил свое мнение. Я оценил, что если вы можете дать мне некоторое руководство, потому что я не могу получить отношение «многие ко многим» к работе ... и значение, которое вы видите, - это просто пространство имен. Когда я создал проект, я сначала пытался работать с автоматом. – JeppePepp

+0

@JeppePepp: Пробовал ли вы это с помощью «Include» в моем ответе выше? Разве это не работало? – Slauma

+0

невозможно использовать лямбда внутри внутреннего удлинителя. Вы можете использовать только строковый путь. Так что нет, это не сработало. Thx для вашего времени. Но все равно не получайте его на работу ... – JeppePepp

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