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); 
} 

我沒有得到任何異常和測試案例passess。

我錯過了關於實體框架的東西還是這是一個錯誤?

+0

任何兒童表課程?據我所知,EF默認情況下不會刪除子實體,而是將其外鍵設置爲parent爲空。看起來像那個錯誤信息。 – magnus 2012-04-05 18:39:36

+0

這就是我在互聯網上找到的。但是當我運行真正的應用程序時,它刪除了課程,它是從數據庫中的孩子(couse會見)。當我刪除線時,測試也會通過。 – keshav 2012-04-05 18:55:51

回答

0

好吧,這已經開放了一段時間了。我還沒有能夠找到一個明確的答案,但更多的工作與MVC和EF我認爲正在發生的事情是,一旦我執行行

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

購買合乎得到加載到對象管理器,因此當父對象被刪除,不再有父對象的引用。