0

У меня есть следующий тестовый случайМожет ли это быть ошибкой?

[TestMethod()] 
    [DeploymentItem("Courses.sdf")] 
    public void RemoveCourseConfirmedTest() 
    { 

     CoursesController_Accessor target = new CoursesController_Accessor(); 
     int id = 50; 

     ActionResult actual; 
     CoursesDBContext db = target.db; 
     Course courseToDelete = db.Courses.Find(id); 

     List<CourseMeet> meets = courseToDelete.meets.ToList<CourseMeet>(); 

     actual = target.RemoveCourseConfirmed(courseToDelete); 
     foreach (var meet in meets) 
     { 
      Assert.IsNull(db.Meets.find(meet)); 
     } 
     Assert.IsNull(db.Courses.Find(courseToDelete.courseID)); 

    } 

который проверяет следующий метод из моего контроллера.

[HttpPost, ActionName("RemoveCourse")] 
    public ActionResult RemoveCourseConfirmed(Course course) 
    { 
     try 
     { 
      db.Entry(course).State = EntityState.Deleted; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      return RedirectToAction("RemoveMeet", new System.Web.Routing.RouteValueDictionary { { "concurrencyError", true } }); 
     } 
     catch (DataException) 
     { 
      ModelState.AddModelError(string.Empty, "Unable to save changes. Try again."); 
      return View(course); 
     } 

    } 

Я знаю, что я должен использовать макет дб .... но для этого проекта я решил пойти с этим подходом.

Так вот что происходит. Когда я запускаю фактический веб-сайт, эта функция отлично работает и удаляет курс и все входящие в него записи.

Но когда я запускаю тест я получаю следующее исключение

System.InvalidOperationException: The operation failed: The relationship could not be 
changed because one or more of the foreign-key properties is non-nullable. When a change is 
made to a relationship, the related foreign-key property is set to a null value. If the 
foreign-key does not support null values, a new relationship must be defined, the foreign- 
key property must be assigned another non-null value, or the unrelated object must be 
deleted. 

Вот еще более интересная часть, если я закомментируйте следующую строку из теста

List<CourseMeet> meets = courseToDelete.meets.ToList<CourseMeet>(); 

и заменить петлю со следующим:

foreach (var meet in db.Meets.ToList()) 
{ 
    Assert.IsFalse(meet.courseID == courseToDelete.courseID); 
} 

У меня нет никаких исключений и паспортов теста.

Я что-то пропустил в Entity Framework или это ошибка?

+0

Любые детские столы на курсы? Насколько я знаю, EF по умолчанию не удаляет дочерние сущности, а вместо этого устанавливает свой внешний ключ для родителя равным null. Похоже на сообщение об ошибке. – magnus

+0

Вот что я нашел в Интернете. Но когда я запускаю приложение actall, оно удаляет курс, и его дети (couse отвечает) из БД. А также тест проходит, когда я удаляю строку. – keshav

ответ

0

Ну, это было открыто некоторое время. Я до сих пор не удалось найти однозначный ответ, но работает больше с MVC и EF я думаю, что происходит в том, что когда я исполняю линии

List<CourseMeet> meets = courseToDelete.meets.ToList<CourseMeet>(); 

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

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