2009-06-18 150 views
7

作爲表單發佈的結果,我試圖保存一個新的品牌記錄。在我看來,性別是一個下拉,返回一個整數,它是由填充的ViewData(「性別」)實體框架EntityKey /外鍵問題

我設置我的鏈接如下:

gID = CInt(Request.Form("Gender")) 
Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID) 
TryUpdateModel(Brand) 
DB.SaveChanges() 

這將導致以下錯誤。

Entities in 'DB_ENTITIES.Brand' participate in the 'FK_Brand_Gender' relationship. 0 related 'Gender' were found. 1 'Gender' is expected. 

有人可以用簡單的英語向我解釋參數。我也試過DB.Gender作爲第一個參數,但沒有喜悅。

回答

18

而不是創建的EntityKey創建存根性別對象 (對不起,我不是一個VB傢伙,所以在C#):

Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))}; 

然後你附加性別,以適當的EntitySet(中的屬性名稱上DB,你得到的性別實體從低於字符串):

DB.AttachTo("Genders",g); 

這使數據庫的狀態下,在沒有數據庫查詢的情況下,性別在ObjectContext處於未更改的狀態。現在你可以建立一個正常的關係

brand.Gender = g; 
DB.AddToBrand(brand); 
DB.SaveChanges(); 

這就是它的全部。無需淤泥周圍EntityKeys

希望這有助於

Alex

1

您需要的是品牌和性別的實例,然後將Brand.Gender設置爲Gender的實例。那麼你可以保存沒有問題。

+0

這是否不涉及往返於我的數據庫?視圖肯定會發回可以綁定的ID。 – Paul 2009-06-18 09:41:32

+0

這取決於,如果對象已經在上下文中,它不需要去數據庫。亞歷克斯詹姆斯的代碼是很好用(它幾乎是我寫的)。 – 2009-06-22 07:29:13

0

好吧,繼承人我想出了,而不是使用updateModel。無論如何,在帖子中添加潛在的附加字段似乎是有問題/潛在的安全風險。 Gender的新實例可以通過trygetObjectByKey實例化。這工作到目前爲止。有關獲取UpdateModel以更新Gender屬性對象的任何其他建議都很有用。

Dim cID As Integer 
cID = CInt(Request.Form("Gender")) 
Dim key As New EntityKey(DB.DefaultContainerName() & ".Gender", "ID", cID) 

Dim objGenderDS As New Gender 
'Bring back the Gender object. 
If DB.TryGetObjectByKey(key, objGenderDS) Then 
Brand.GenderReference.EntityKey = key 
Brand.Gender = objGenderDS 
DB.AddToBrand(Brand) 
DB.SaveChanges() 
Else 
End If