Связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не могут быть обнулены в MVC 4

Я получаю эту ошибку после нажатия Сохранить (обновить) мою форму:

Связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.

Вот мой контроллер (случай "Сохранить" в проблеме swich couse):

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(UserModel userModel, string act = null, int idx = 0)
{
    using (var dbContext = new userDbEntities())
    {

        if (userModel.User == null)
        {
           userModel.User = new UsersTable();
        }
        var newUser = userModel.User.userID == 0;
        userModel.CustomTypes = dbContext.CustomTypes.ToList();

        switch (act)
        {
            case "addcustom":
                userModel.User.CustomerTables.Add(new CustomerTable
                {
                    CustomType = new CustomType(),
                    UsersTable = userModel.User
                });
                break;
             case "deletecustom":
                 userModel.User.CustomerTables.RemoveAt(idx);
                 break;
             case "save":
                 foreach (var customer in userModel.User.CustomerTables)
                 {
                    customer.CustomType = dbContext.CustomTypes.Find(customer.CustomType.Id_NewCustomerType);
                 }
                 var dbUser = dbContext.UsersTables.Find(userModel.User.userID);
                 dbUser.TimeZoneId = userModel.User.TimeZoneId;
                 foreach (var custom in userModel.User.CustomerTables)
                 {
                      if (custom.CustomerID == 0)
                                dbUser.CustomerTables.Add(custom);
                 }
                 foreach (var custom in dbUser.CustomerTables.ToList())
                 {
                       var modelCustom =
                                userModel.User.CustomerTables.FirstOrDefault(o => o.CustomerID == custom.CustomerID);
                       if (modelCustom != null) //update it
                       {
                           custom.CustomType =
                                    dbContext.CustomTypes.Find(modelCustom.CustomType.Id_NewCustomerType);
                       }


                       if (userModel.User.CustomerTables.All(o => o.CustomerID != custom.CustomerID))
                                dbUser.CustomerTables.Remove(custom);
                  }
                  dbContext.SaveChanges();
                  break;
        } // end switch statements
        return View("Edit", userModel);
    }
}

Любая идея, что не так...

Ответ 2

Существует более простой способ решить эту проблему.
На самом деле это связано с тем, что у вас есть отношения друг к другу. Если вы хотите удалить 1 сторону, у вас есть два сценария; Вы можете выбрать каскадное удаление, или вы не можете выбрать его.
Если вы выберете первый вариант, он удалит все боковые сущности при удалении 1 стороны. Вы можете установить этот параметр в диаграмме сущности. Вам нужно только выбрать отношения и установить свойство "End1 OnDelete" в Cascade.

Ответ 3

Я столкнулся с этим сообщением, оказалось, что я отмечал объект как Измененный после того, как я удалил его из него, а не удалив его.

Например, вы не хотите звонить  context.Entry(child).State = EntityState.Modified;
если на самом деле вы пытаетесь удалить ребенка.

вместо этого, а также удаление дочернего элемента из коллекции попробуйте что-то вроде context.DeleteObject(child)

  • У меня нет точного кода, потому что мой опыт был связан с Dev Express XAF ObjectSpace, который может быть перенесен в ObjectContext, используя (Object Object) пространство (EFObjectSpace)).ObjectContext;

Ответ 4

У меня возникла эта проблема, это сложно объяснить (так что прошу простить аналогию), хорошая новость в том, что решение очень простое.

Предположим, что у меня есть запись с отношением от одного до многих, которое также имеет отношения. ( "Автомобиль" имеет ряд "Людей", "Люди" имеют множество "Детей" ). Ошибка возникает при удалении людей из автомобиля. Выполнение db.Cars.Remove(person);. Вызванная несвязанная ошибка. Чтобы решить эту проблему, я сделал db.Cars.Persons.RemoveRange(children); < --- После этого я испытал ошибку, указанную в этом вопросе. Чтобы решить эту проблему, удалите дочерние дочерние элементы из базы данных (а не "Родитель", кроме базы данных) db.Children.RemoveRange(childrenOfPeople);.

Это самое чистое решение проблемы с использованием структуры сущности правильно, не устанавливая состояние записей. Надежда помогает кому-то.