2014-05-15 20 views
10

我收到此錯誤後,點擊保存(更新)我的表格:的關係無法改變,因爲一個或多個外鍵的屬性是MVC非空的4

的關係無法因爲一個或多個外鍵屬性是不可空的而被更改。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

這裏是我的控制器(案 「保存」 在SWICH淡然的問題):

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

任何想法是錯誤的...

+0

好的,如果改變dbUser.CustomerTables.Remove(custom);到dbContext.Entry(自定義).State = EntityState.Deleted;修復問題,但然後簡單添加(保存不起作用) –

+0

可能重複的[該關係無法更改,因爲一個或多個外鍵屬性是不可空](http://stackoverflow.com/questions/5538974/the-relationship-could-be-changed-because-one-more-the-the-foreign-key-pro) –

回答

4

還有就是要解決這個問題,一個簡單的方法。
其實這是因爲你有一對多的關係。當你想刪除一面時,你有兩個場景;您可以選擇級聯刪除,也可以選擇無。
如果您選擇第一個選項,刪除1面時會刪除所有多邊實體。 您可以在實體圖中設置此選項。您只需選擇關係並將「End1 OnDelete」屬性設置爲Cascade。

+0

是否有一條命令來標記要從C#中級聯執行的刪除語句/ EntityFramework代碼? –

0

我遇到了這條消息,事實證明,我將該對象標記爲「修改」後,我將其從集合中刪除,而不是刪除它。

例如,你不想調用 context.Entry(child).State = EntityState.Modified;
如果實際上你試圖刪除孩子。

代替,以及從集合中移除孩子嘗試像context.DeleteObject(孩子)

  • 我還沒有得到確切的代碼,因爲我的經驗是與開發快速XAF對象空間可以是使用((EFObjectSpace)objectSpace)強制轉換爲ObjectContext。
0

我遇到過這個問題,解釋起來很複雜(所以請原諒類比),好消息是解決方案非常簡單。

假設我有一對多的關係的記錄,這也有一個關係。 (一輛「汽車」有一些「人」,「人」有一些「孩子」)。從汽車中移除人員時發生錯誤。做一個db.Cars.Remove(person);。導致無關的錯誤。爲了解決這個問題,我做了一個db.Cars.Persons.RemoveRange(children); < ---之後,我遇到了這個問題所述的錯誤。爲了解決這個問題,從數據庫中刪除孩子的孩子(不是「父母」,而是數據庫iteself)db.Children.RemoveRange(childrenOfPeople);

這是在不設置記錄狀態的情況下正確使用實體框架的問題的最乾淨的解決方案。希望能幫助別人。

相關問題