У меня есть три связанные таблицы. Календарь 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; }
}
По какой-то причине, когда я сохраняю изменения календаря быть удален, а? Я искал немного, но у меня нет такой же проблемы. Я делаю это неправильно? Есть ли лучший способ обновить/удалить связанные объекты?
janspeed - может быть полезно ознакомиться с вашими классами моделей, чтобы установить установленные в нем правила. Я также думаю, что вы вызываете у себя много горя, имея механику низкого уровня для прикрепления таблиц и настройки измененных и т. Д. И т. Д. Внутри вашего контроллера. класс обслуживания или еще лучше какая-то общая оболочка скроет всю эту ошибку, подверженную отклонению –
Возможно, вы правы, и я реорганизую его позже. Я добавил классы моделей. Они довольно простые. И отношения работают. Почти слишком хорошо. – Janspeed
Проблема заключается в том, что родитель удаляется, как только я удаляю или очищаю() детей. Я даже попытался удалить их вручную. – Janspeed