Entity framework 实体框架EntityKey/外键问题

Entity framework 实体框架EntityKey/外键问题,entity-framework,foreign-keys,entity,entitykey,Entity Framework,Foreign Keys,Entity,Entitykey,作为一个表单帖子的结果,我试图保存一个新的品牌记录。在我看来,性别是一个下拉列表,返回一个整数,由ViewData(“性别”)填充 我已按如下方式设置我的链接: gID = CInt(Request.Form("Gender")) Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID) TryUpdateModel(Brand) DB.SaveChanges() 这将导致以下错误 Enti

作为一个表单帖子的结果,我试图保存一个新的品牌记录。在我看来,性别是一个下拉列表,返回一个整数,由ViewData(“性别”)填充

我已按如下方式设置我的链接:

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作为第一个参数,但没有乐趣

您需要的是Brand和Gender的实例,然后将Brand.Gender设置为Gender的实例。然后你就可以毫无问题地保存了。

好的,这是我的想法,而不是使用updateModel。这似乎是有问题的/潜在的安全风险,因为在帖子中添加了潜在的附加字段。可以通过trygetObjectByKey实例化新的性别实例。到目前为止,这是有效的。关于让UpdateModel更新性别属性对象的任何其他建议

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

创建存根对象而不是创建EntityKey (对不起,我不是VB高手,所以在C#)中:

然后将性别附加到相应的
EntitySet
(从
DB
上获取性别实体的属性名称如下所示):

这会使数据库处于性别在
ObjectContext
中处于未更改状态的状态,而无需数据库查询。现在你可以按照正常的方式建立关系了

brand.Gender = g;
DB.AddToBrand(brand);
DB.SaveChanges();
这就是全部。无需乱动
EntityKeys

希望这有帮助


这不包括往返我的DB吗?当然,视图正在发回一个可以绑定的ID。这取决于,如果对象已经在上下文中,它不需要访问数据库。Alex James的代码很好用(它和我写的差不多)。感谢Alex的响应——现在就知道了:ObjectStateManager中已经存在一个具有相同键的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象。Paul,您是如何解决“具有相同密钥的多个对象”问题的?我得到了同样的结果。在将某些内容附加到上下文之前,您应该使用LINQ to Objects检查ObjectStateManager,以检查相同的对象是否已经存在。
DB.AttachTo("Genders",g);
brand.Gender = g;
DB.AddToBrand(brand);
DB.SaveChanges();