Entity Framework EntityKey / Проблема внешнего ключа
-
06-07-2019 - |
Вопрос
В результате публикации формы я пытаюсь сохранить новую запись бренда. На мой взгляд, Gender - это выпадающий список, возвращающий Integer, который заполняется из 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 в качестве первого параметра, но без радости. Р>
Решение
Вместо создания EntityKey создайте заглушку объект Gender (извините, я не VB парень, так в C #):
Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))};
Затем вы присоединяете пол к соответствующему EntitySet
(имя свойства в БД
, из которого вы получаете сущности Gender, приведено в следующей строке):
DB.AttachTo("Genders",g);
Это переводит базу данных в состояние, где пол находится в ObjectContext
в неизменном состоянии без запроса к базе данных. Теперь вы можете строить отношения как обычно
brand.Gender = g;
DB.AddToBrand(brand);
DB.SaveChanges();
Это все, что нужно сделать. Нет необходимости возиться с EntityKeys
Надеюсь, это поможет
Другие советы
Вам нужен экземпляр как бренда, так и пола, а затем установите для Brand.Gender экземпляр пола. Тогда вы можете сохранить без проблем.
Хорошо, вот что я придумал вместо использования 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