2012-05-30 7 views
0

У меня есть три связанные таблицы. Календарь 1 ... * CalendarUser * ... 1 Пользователь. Когда я редактировал CalendarUsers в представлении календаря редактирования, я затем возвращаю ViewModel обратно в контроллер. Вот мой код контроллера:Очистка детей удаляет родителя

[HttpPost] 
    public ActionResult Edit(int id, CreateCalendarViewModel cvm) 
    { 
     long userId = long.Parse(User.Identity.Name); 

     db.Calendars.Attach(cvm.CurrentCalendar); 
     cvm.Users= DbExtensions.GetUserList(userId); 

     if (ModelState.IsValid) 
     { 
      ////Remove the deselected users 
      cvm.CurrentCalendar.CalendarUsers.Clear(); 

      //Get the names from the selected users 
      var selectedUsers = from u in cvm.Users 
           where cvm.SelectedUsers.Contains(u.Key) 
           select new KeyValuePair<long, string>(long.Parse(u.Key), u.Value); 

      foreach (var selectedUser in selectedUsers) 
      { 

       User user = db.Users.Find(selectedUser.Key); 

       //If usr does not exist create a new 
       if (user == null) 
       { 
        db.Users.Add(new User 
        { 
         UserId = selectedUser.Key, 
         Name = selectedUser.Value, 
         Expires = DateTime.Now, 
         AccessToken = string.Empty 
        }); 
       } 

       //Add the binding to the calendar 
       cvm.CurrentCalendar.CalendarUsers.Add(new CalendarUser 
       { 
        CalendarId = cvm.CurrentCalendar.CalendarId, 
        UserId = selectedUser.Key 
       }); 
      } 

      db.Entry(cvm.CurrentCalendar).State = EntityState.Modified; 

      db.SaveChanges(); 

     } 

     return View(cvm); 
    } 

Вот мои классы:

public partial class Calendar 
{ 
    public Calendar() 
    { 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public int CalendarId { get; set; } 
    public string CalendarTitle { get; set; } 
    public string CalendarDescription { get; set; } 
    public long UserId { get; set; } 

    public virtual User User { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

public partial class CalendarUser 
{ 
    public int CalendarUserId { get; set; } 
    public int CalendarId { get; set; } 
    public long UserId { get; set; } 
    public Nullable<bool> IsAdmin { get; set; } 

    public virtual Calendar Calendar { get; set; } 
    public virtual User User { get; set; } 
} 

public partial class User 
{ 
    public User() 
    { 
     this.Calendars = new HashSet<Calendar>(); 
     this.CalendarUsers = new HashSet<CalendarUser>(); 
    } 

    public long UserId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Calendar> Calendars { get; set; } 
    public virtual ICollection<CalendarUser> CalendarUsers { get; set; } 
} 

По какой-то причине, когда я сохраняю изменения календаря быть удален, а? Я искал немного, но у меня нет такой же проблемы. Я делаю это неправильно? Есть ли лучший способ обновить/удалить связанные объекты?

+0

janspeed - может быть полезно ознакомиться с вашими классами моделей, чтобы установить установленные в нем правила. Я также думаю, что вы вызываете у себя много горя, имея механику низкого уровня для прикрепления таблиц и настройки измененных и т. Д. И т. Д. Внутри вашего контроллера. класс обслуживания или еще лучше какая-то общая оболочка скроет всю эту ошибку, подверженную отклонению –

+0

Возможно, вы правы, и я реорганизую его позже. Я добавил классы моделей. Они довольно простые. И отношения работают. Почти слишком хорошо. – Janspeed

+0

Проблема заключается в том, что родитель удаляется, как только я удаляю или очищаю() детей. Я даже попытался удалить их вручную. – Janspeed

ответ

1

Кажется, что я забыл включить скрытое поле в представление, содержащее идентификатор пользователя, и результатом было то, что когда я обновил календарь, который он сохранил с Id = 0, и таким образом спрятал объекты в представлении для указанного пользователя. Умственная нота: всегда проверяйте в базе данных, что действительно происходит.

Мне также нужно посмотреть, что происходит, когда я отправляю объекты назад и вперед между представлениями и контроллером. Иногда кажется, что он управляется сам по себе, и иногда мне нужно самим указывать все поля.

+0

+1 для проверки базы данных. – Doomsknight

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