2009-06-18 153 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