2009-06-04 68 views
4

本週我試圖與EF握手,但我現在確定,但我剛剛打了我的第一個主要障礙。我有一個項目表和一個類別表。每個項目都可以用多種類別「標記」,因此我創建了一個鏈接表。兩列,一個是項目的主要ID,另一個是類別的主要ID。我手動添加了一些數據到數據庫,我可以在我的代碼中通過EF查詢它。添加和刪除關聯 - 實體框架

現在我想'標記'一個新的項目與其中一個現有的類別。我有要添加的類別ID和該項目的ID。我使用linq加載兩個實體,然後嘗試以下操作。

 int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue); 
    var categoryToAdd = db.CollectionCategorySet.First(x => x.ID == categoryToAddId); 
    currentCollectionItem.Categories.Add(categoryToAdd); 
    db.SaveChanges(); 

,但我得到「無法更新EntitySet的‘collectionItemCategories’,因爲它有一個DefiningQuery並沒有元素來支持當前操作的元素存在。」

我錯過了什麼嗎?這不是正確的做法嗎?我嘗試去除同樣的東西,也沒有運氣。

回答

1

我想我已經設法自己回答這個問題。經過大量的研究發現,實體框架(VS2008 SP1)實際上並不能真正支持多對多的關係。該框架確實通過這個關係創建了另一個對象的對象列表,這個關係非常好,但是當涉及添加和刪除關係時,這不是很容易完成。您需要編寫自己的存儲過程來執行此操作,然後使用功能導入路線將其註冊到實體框架中。

此路由還存在另外一個問題,那就是不會返回任何內容(如添加多對多關係)的函數導入不會添加到對象上下文中。所以當你編寫代碼時,你不能像你所期望的那樣使用它們。

現在,我將簡單地堅持使用performtenonquery()以舊式方式執行這些過程。顯然對此更好的支持應該會在VS2010中出現。

如果有人認爲我得到了我的事實錯誤,請隨時把我的權利。

0

創建Item對象後,需要將Item對象設置爲Item的Categories屬性中的Category對象。如果要添加一個新的項目對象,做這樣的事情:

Using (YourContext ctx = new YourContext()) 
{ 
    //Create new Item object 
    Item oItem = new Item(); 
    //Generate new Guid for Item object (sample) 
    oItem.ID = new Guid(); 
    //Assign a new Title for Item object (sample) 
    oItem.Title = "Some Title"; 
    //Get the CategoryID to apply to the new Item from a DropDownList 
    int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue); 
    //Instantiate a Category object where Category equals categoryToAddId 
    var oCategory = db.CategorySet.First(x => x.ID == categoryToAddId); 
    //Set Item object's Categories property to the Category object 
    oItem.Categories = oCategory; 
    //Add new Item object to db context for saving 
    ctx.AddtoItemSet(oItem); 
    //Save to Database 
    ctx.SaveChanges(); 
} 
+0

感謝您的幫助,但我很確定只是看着這不會起作用。您試圖將項目類別(類別對象列表)設置爲類別(單個類別對象)。很明顯,這種不匹配是行不通的。 簡而言之,我想我的問題是,如何添加和刪除參考表數據,其中Categories是我的參考表。 – 2009-06-08 13:14:56

+0

我根據CategoryID將oCategory設置爲Category中的第一條記錄。然後,您可以將Categories屬性設置爲單個Category對象。我相信你也可以用下面的代碼替換那行代碼: oItem.Categories.CategoryID = oCategory.CategoryID; – 2009-06-08 17:12:15

0

有你把兩列外鍵在您的鏈接表項和類別或定義的關係爲多對多的映射細節?