Entity Framework EntityKey / Проблема внешнего ключа - PullRequest
7 голосов
/ 18 июня 2009

В результате публикации формы я пытаюсь сохранить новую запись бренда. На мой взгляд, Gender - это выпадающий список, возвращающий целое число, которое заполняется из 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 в качестве первого параметра, но без радости.

Ответы [ 3 ]

18 голосов
/ 18 июня 2009

Вместо создания EntityKey создайте заглушку объект Gender (извините, я не 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 голос
/ 18 июня 2009

Вам нужен экземпляр как Бренда, так и Пола, а затем установите Brand.Gender на экземпляр Пола. Тогда вы можете сохранить без проблем.

0 голосов
/ 18 июня 2009

Хорошо, вот что я придумал вместо использования 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
...