Как заставить EF6 соблюдать Уникальное ограничение (на FK) в множественности ассоциаций / отношений?
Это может быть связано с моим другим вопросом - который, кажется, также:
Entity Framework - ужасный картограф реляционной алгебры 1 или;
(на что я надеюсь) Я пропускаю что-то с SSDL/CSDL и моделью EDMX или отображениями EF в целом.
У меня есть модель Schema First, и схема выглядит так:
ExternalMaps
---
emap_id - PK
Melds
---
meld_id - PK
emap_id - >>UNIQUE INDEX<< over not-null column, FK to ExternalMaps.emap_id
Для проверки они написаны следующим образом, что должно привести к множественности ExternalMaps:1 <-> 0..1:Melds
2
ALTER TABLE [dbo].[Melds] WITH CHECK ADD CONSTRAINT [FK_Melds_ExternalMaps]
FOREIGN KEY([emap_id]) REFERENCES [dbo].[ExternalMaps] ([emap_id])
CREATE UNIQUE NONCLUSTERED INDEX [IX_Melds] ON [dbo].[Melds] ([emap_id] ASC)
Тем не менее, когда я использую конструктор EDMX для обновления из базы данных (SQL Server 2012), он с нуля неправильно создает отношение "связь / внешний ключ" как ExternalMap:1 <-> M:Meld
,
Когда я пытаюсь вручную изменить кратность для стороны Meld (через свойства "Набор ассоциаций" в конструкторе), либо 1
или же 0..1
, Я получил:
Выполнение преобразования: кратность недопустима в роли "Meld" в отношении "FK_Melds_ExternalMaps" . Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть
*
,
(Как и в случае с моим другим вопросом, это, по-видимому, связано с тем, что уникальные ограничения не были правильно зарегистрированы / отмечены как ключи-кандидаты.)
Как я могу получить EF в честь 1 <-> 0..1/1
кратность, как установлено моделью?
1 Хотя я надеюсь, что это не так, у меня нет конца печали, когда я пытаюсь заставить EF отобразить на совершенно правильную модель RA: LINQ to SQL (L2S) не имеет этой проблемы. Так как на другой популярный ORM мой другой вопрос не получил простого ответа, я теряю веру в этот инструмент.
2 По замыслу ФК это не другой путь: "Хотя не должно быть никаких внешних ключей, которые могут обнуляться" . - Это также не тот случай, когда это "общий" ПК, как этот ответ 2009 года предлагает в качестве исправления.
Я использую EF 6.1.1, VS 2013 Ultimate и не собираюсь использовать какие-либо "функции подтипов ОО" - если это что-то изменит.
РЕДАКТИРОВАТЬ вздох:
Кратность недопустима, потому что свойства зависимой роли не являются ключевыми свойствами? (с 2011 года) - так ли это до сих пор для EF "Microsoft Enterprise-Ready" готова ORM в 2014 2015?
В следующий раз, когда кто-то спросит, почему EF не использовался, у меня будет большой набор причин, кроме "LINQ to SQL работает отлично" .
1 ответ
Проблема в том, что Entity Framework (от EF4 до EF6.1, и кто знает, сколько еще) не "понимает" понятие Уникальных Ограничений и всего, что они подразумевают: EF отображает Code First, а не Relational Algebra * sigh *
Этот ответ на мой связанный вопрос содержит ссылку на запрос о добавлении недостающей функциональности и суммирует ее:
.. Entity Framework в настоящее время поддерживает только основание ссылочных ограничений на первичных ключах и не имеет понятия уникального ограничения.
Это может быть расширено почти до всех областей, имеющих дело с Уникальными Ограничениями и Ключами-Кандидатами, включая проблему множественности, поднятую в этом вопросе.
Я был бы счастлив, если бы это серьезное ограничение EF было открыто обсуждено и сделано "общеизвестным", особенно когда EF рекламируется для поддержки Schema First и / или замены L2S. С моей точки зрения, EF сосредоточен на картировании (и поддержке) только Code First как первоклассного гражданина. Может быть, еще через 4 года..