Попытка разрешить nulls, но... "Nullable object должен иметь значение"

Я пытаюсь разрешить nulls в моем раскрывающемся списке, в моей таблице базы данных, которую я установил, разрешает null для этого конкретного поля, которое является int, но когда я запускаю код, я получаю сообщение об ошибке: "Nullable object должен иметь значение", Я думаю, проблема может быть в ModelState.

контроллер

[HttpPost]
    public ActionResult Edit(Student student)
    {
        if (ModelState.IsValid)
        {
            db.Entry(student).State = EntityState.Modified;
            db.SaveChanges();
            Loan w = new Loan()
            {
                StudentID = student.StudentID,
                ISBN = student.ISBN.Value,
            };
            db.Loans.Add(w);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.ISBN1 = new SelectList(db.Books, "ISBN", "Titulli", student.ISBN);
        return View(student);
    }

Ответ 1

Вы получаете эту ошибку при попытке получить значение объекта с возможностью nullable, который не имеет значения. Если свойство Loan.ISBN не имеет значения NULL, вы должны указать значение по умолчанию для этого свойства

ISBN = student.ISBN.HasValue ? student.ISBN.Value : defaultValue
// or ISBN = student.ISBN ?? defaultValue
// or ISBN = student.ISBN.GetValueOrDefault()

Если свойство Loan.ISBN имеет значение NULL, просто присвойте student.ISBN без доступа к Value типа с нулевым значением

ISBN = student.ISBN

Ответ 2

Это исключение возникает, когда вы пытаетесь получить доступ к свойству Value типа Nullable, когда HasValue является ложным. См. Nullable Types в MSDN. Поэтому прежде всего проверьте эту строку

ISBN = student.ISBN.Value

чтобы увидеть, не имеет ли значение ISBN null. Вы можете изменить эту строку на

ISBN = student.ISBN.GetValueOrDefault();

Ответ 3

Самый короткий способ выполнить одну и ту же задачу с помощью оператора coalesce, показанного ниже:

ISBN = student.ISBN ?? defaultValue;

Оператор coalesce работает следующим образом: если первое значение (левая сторона) равно NULL, тогда С# оценивает второе выражение (правая сторона).