Я пытаюсь обновить модель, но получаю сообщение об ошибке «Операция завершилась неудачно: связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не допускают значения NULL. Когда в отношение вносятся изменения, связанные Для свойства внешнего ключа установлено значение NULL.Если внешний ключ не поддерживает значения NULL, необходимо определить новую связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от NULL, или несвязанный объект должен быть удален . "
Насколько я понимаю из Связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не допускают значения NULL проблема может заключаться в том, как Entity Framework обрабатывает мою виртуальную коллекцию ICollection
Однако я не совсем уверен, как реализовать решение при использовании шаблона репозитория с шаблоном. Надо ли редактировать метод Save () класса ParentObjectRepository?
На самом деле я действительно думаю, что должен быть какой-то способ заставить EF это понять. Я не понимаю, как думала команда EF: «Вероятно, никто не использует коллекцию объектов с ограничением внешнего ключа, давайте не будем поддерживать это».
Обновить Добавлен код
[HttpPost]
public ActionResult Edit(int id, FormCollection formCollection)
{
var eventRepository = new MagnetEventRepository();
var original = eventRepository.Find(id);
UpdateModel(original);
eventRepository.Save();
return RedirectToAction("Details", "Home", new { slug = original.Slug });
}
public void Save()
{
context.SaveChanges();
}
Больше кода:
public class MagnetEvent
{
public virtual int Id { get; set; }
[Required]
public virtual string Name { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}")]
[DataType(DataType.DateTime)]
public virtual DateTime? StartDate { get; set; }
public virtual string Description { get; set; }
[StringLength(100)]
public virtual string Slug { get; set; }
public virtual int MaximumCapacity { get; set; }
[DataType(DataType.Currency)]
public virtual int TicketPrice { get; set; }
public virtual int LocationId { get; set; }
public virtual Location Location { get; set; }
public virtual Collection<Ticket> Tickets { get; set; }
public virtual Collection<AttendeeInformationField> CaptureAttendeeInformationFields { get; set; }
public virtual int CustomerId { get; set; }
[Required]
public virtual CUSTOMER Customer { get; set; }
}
Метод Save () взят из MagnetEventRepository, созданного на основе вышеуказанного класса.
Другое обновление. Я успешно удалил ошибку, изменив MagnetEventId в AttendeeInformationField на nullable int. Изучая базу данных, я вижу, что именно не так.
Допустим, у меня есть одно поле AttendeeInformationField со значением «Электронная почта». Когда я редактирую свой MagnetEvent, AttendeeInformationField обновляет MagnetEventId до нуля, а затем добавляет новый пост с правильными MagnetEventId и Value.
Я бы очень предпочел, чтобы вместо этого обновлялись сообщения в AttendeeInformationField.