2010-07-17 73 views
0

我試圖教我自己的LINQ to SQL,並決定做一個小的MVC.NET項目讓我的腳溼。問題在於我很早就陷入了以下錯誤。不能保存更改使用LINQ to SQL有子鍵約束

我正在做一個高爾夫應用程序,所以我已經建立了數據庫,並得到了我的dbml類。該數據庫有一個course表和一個hole表。 hole表通過其主鍵引用courseId,並對其有一個外鍵約束。所以都非常標準。

我有我的控制器上的MVC動作,讓我來編輯課程信息(名稱,孔的信息,例如,面值和中風指數等)

當我做編輯後保存我收到以下錯誤。

試圖刪除課程和空穴之間的關係。但是,這種關係的一個外鍵(Hole.CourseId)不能設置爲null。」

我已經調試過,看不到任何問題。有什麼我需要做的數據庫,讓我編輯表與外鍵約束?

這裏是動作代碼:

[HttpPost] 
    [ValidateInput(true)] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     var courseViewModel = new CourseViewModel { Course = _repository.GetCourse(id) }; 

     if (courseViewModel.Course == null) 
     { 
      return View("NotFound", string.Format("Course {0} Not Found", id)); 
     } 

     try 
     { 
      UpdateModel(courseViewModel); 
      _repository.SubmitChanges(); 

      return RedirectToAction("Index", "Course"); 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations()); 
      ModelState.AddModelError("", ex.Message); 

      return View(courseViewModel); 
     } 
    } 

凡_repository看起來是這樣的:

namespace Web.Repository 
    { 
     public class MyRepository 
     { 
      private MyDataContext db = new MyDataContext(); 

      public void SubmitChanges() 
      { 
       db.SubmitChanges(); 
      } 

      public Course GetCourse(int id) 
      { 
       return db.Courses.SingleOrDefault(i => i.CourseId == id); 
      } 
     } 
    } 

回答

0

什麼的UpdateModel嗎?假設它對視圖模型上的課程成員進行了更改,則可能需要考慮如下的存儲庫方法:

public void SaveCourse(Course course) 
{ 
    db.Courses.Attach(course); 
    db.SubmitChanges(); 
} 
+0

感謝您的回覆。 UpdateModel是對標準MVC Controller.UpdateModel()方法的調用。在這種情況下,它更新courseViewModel與客戶端的變化,所以更改courseViewModel.Course和courseViewModel.Course.Holes以及 – 2010-07-19 07:51:31

+0

我試過這個建議,但現在得到: 「不能附加一個已存在的實體。 – 2010-07-19 12:34:57

+0

看起來上下文永遠不會丟失,但UpdateModel會將FK字段設置爲null。最好將視圖模型與實體分開,發佈到視圖模型,並僅使用您希望修改的值對顯示的實體進行顯式更新。 – 2010-07-19 13:48:06