3

我收到一個例外:刪除記錄實體框架

無法更新EntitySet的「會話」,因爲它有一個DefiningQuery並沒有 元素的元素存在於 支持當前的操作。

嘗試從數據庫表中刪除一行時。對於存在的行調用SaveChanges()時會出現異常。以下是我的代碼:

public static Func<DC21GPDEntities, string, IQueryable<Session>> compiledDeleteQuery = 
    CompiledQuery.Compile((DC21GPDEntities ctx, string userId) => 
     (from rows in ctx.Sessions 
     where rows.User_ID == userId 
     select rows)); 

[HttpPost] 
public ActionResult Index(string searchItem) 
{ 
    try 
    { 
     string userId =searchItem.Trim(); 
     string successMessage 
       = "The session for User ID: " + userId + " has been cleared in Fascor."; 

     dc21gpdContext.CommandTimeout = 180; 

     Models.Session session = Queries.compiledDeleteQuery(dc21gpdContext, userId).FirstOrDefault(); 

     if (session == null) 
      successMessage = "Session for User ID: " + userId + " does noe exist"; 
     else 
     { 
      dc21gpdContext.DeleteObject(session); 
      dc21gpdContext.SaveChanges(); 
     } 

     ViewData["SuccessMessage"] = successMessage; 
     return View(); 
    } 
    catch (Exception ex) 
    { 
    ViewData["SuccessMessage"] = "Failed to clear session"; 
    return View(); 
    } 
} 
+2

會話表是否有主鍵? – 2012-01-17 21:08:24

+0

@Klaus Byskov Hoffmann:不幸的是,它沒有主鍵 – 14578446 2012-01-17 21:43:55

回答

1

如果您的Session表沒有主鍵,則它被映射爲DefiningQuery,這使得它只能讀取。除非您創建定義這些操作的存儲過程並將它們映射到模型中,否則無法刪除,插入或更新映射到DefinedQuery的記錄。

即使在此之後,它不一定是不夠的。實體被他們的密鑰刪除。您可以在實體模型中定義鍵,但鍵必須唯一標識記錄。默認情況下,EF將使用所有不可爲空的非二進制列作爲鍵。如果這組列沒有唯一標識記錄,則使用Session實體時會遇到更多問題(例如,刪除操作將刪除多條記錄,並且SaveChanges將失敗) - 在這種情況下,唯一的選擇是將唯一列添加到該表並將其用作關鍵字。一旦你將PK添加到表中,所有這些問題都將被解決。

+0

我在表格中有多個coulumns,符合PK條件,我可以看到這些在設計器中被標記爲實體鍵。 User_id是其中的一個列,但我無法刪除記錄,並收到上述異常。 – 14578446 2012-01-18 14:42:24

1

該消息告訴問題是什麼,只是不是很好。我會盡力詳細說明。

實體框架默認爲獲取對象生成查詢。 「Session」對象的EntityContainer具有明確的查詢,這意味着EntityFramework被告知使用特定的手寫sql(或存儲過程)來獲取Sessions。

當您覆蓋該行爲時,還必須提供一個查詢,告訴它如何刪除會話。 Here is the documentation關於如何將這種刪除功能添加到您的實體框架容器。