Комбинированные ключи DB с Entity Framework 4.0
Реконструкция большой базы данных в нашей компании широко использует составные первичные ключи в базе данных.
Забывая влияние производительности, это вызовет любые трудности при работе с этим db в Entity Framework 4.0? Структура базы данных вряд ли изменится, и я не ищу "философские" дебаты, но каковы практические последствия?
Согласно Джереми Миллер, "Композитный ключ делает любое сопоставление объектов и реляций и упорство в целом сложнее". но он действительно не говорит, почему. Является ли это ссылкой на то, как Entity Framework 4.0 обрабатывает ключи?
Ответы
Ответ 1
Нет, EF4 прекрасно поддерживает составные клавиши.
Проблема - это таблица с суррогатным ключом и составными клавишами. Вы можете установить только одну клавишу для каждой модели; этот ключ может иметь несколько полей, но его можно использовать только с точки зрения дизайнера. Не уверен, что вы вручную редактируете xml или только код.
Вы можете установить поле как идентификатор, а не ключ, если вам нужен составной и суррогатный ключ в одной таблице. Поле Identity (Id) не будет использоваться объектом ObjectContext или ObjectStateTracker, но будет увеличиваться и быть запрограммированным как можно точнее.
Ответ 2
У меня были проблемы с EF4 и составными ключами. Он не поддерживает столбцы, используемые в качестве компонентов более чем в одном ключе в таблице соединений.
См. мой предыдущий вопрос Сопоставление сложных внешних ключей во многих отношениях в Entity Framework для более подробной информации. Гайки это то, что когда у вас есть таблица соединений (описывающая много-много отношений), где оба отношения используют общий ключ, вы получите сообщение об ошибке, например
Ошибка 3021: проблема при сопоставлении фрагменты...: Каждый из следующих столбцы в таблице PageView сопоставляется с несколько концептуальных боковых свойств: PageView.Version отображается на (PageView_Association.View.Version, PageView_Association.Page.Version)
Единственный способ обойти это было, чтобы дублировать столбец, который побеждает цель иметь его там вообще.
Удачи!