Почему EF 4 не создает ассоциацию для связи FK со столбцом с уникальным индексом? - PullRequest
9 голосов
/ 18 августа 2010

Я столкнулся со сценарием, в котором Entity Framework 4.0 не генерирует связь с сущностью, подкрепленной таблицей, имеющей уникальный индекс, и мне интересно, почему.

Основная настройка такова: допустим, у меня есть две таблицы в SQL Server 2008 R2 и отношение внешнего ключа:

CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [GroupId] [int] NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Group](
[Id] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[User]  WITH CHECK ADD  CONSTRAINT [FK_User_Group] 
    FOREIGN KEY([GroupId])
REFERENCES [dbo].[Group] ([Id])

Кроме того, предположим, что присутствует следующий индекс:

CREATE NONCLUSTERED INDEX [IX_Group] ON [dbo].[Group] 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Если я скажу конструктору в Visual Studio 2010 сгенерировать модель данных сущности ADO.NET, я получу модель с двумя классами User и Group, User, имеющую свойство навигации с именем Group. Это все хорошо и хорошо.

Теперь предположим, что индекс выглядел следующим образом:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Group] ON [dbo].[Group] 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

То есть, only , что я сделал, - сделал индекс уникальным. После этого, когда я скажу разработчику Visual Studio сгенерировать Entity Model, связь между пользователями и группами не будет отображаться, а User не будет иметь свойств навигации. Проверка сгенерированного файла EDMX показывает, что в модели хранения вообще отсутствует AssociationSet.

Может кто-нибудь объяснить, почему это так? Почему уникальный индекс не позволяет EF моделировать отношения?

Спасибо.

Ответы [ 2 ]

12 голосов
/ 18 августа 2010

Уникальный индекс допускает значение 1 NULL, первичный ключ не допускает NULLS.Как вы будете соответствовать NULL, если ничто не равно NULL, даже если нет другого NULL

1 голос
/ 25 февраля 2012

У меня такая же проблема. Однако в моем случае столбец, на который я пытаюсь ссылаться, не является первичным ключом. Следовательно, это не сработает. Файл EDMX не будет компилироваться, говоря, что он должен ссылаться на первичный ключ. Это имеет смысл. Единственная причина, по которой я сталкиваюсь с этой проблемой, заключается в том, что я имею дело с устаревшей базой данных, которая была плохо спроектирована.

Однако в вашем случае вы создаете уникальный индекс для столбца идентификаторов. Зачем? Столбец идентичности гарантированно будет уникальным в любом случае. Кроме того, это ваш первичный ключ, который по умолчанию будет иметь индекс.

Я нашел эту ссылку, которая объясняет, что ассоциации с уникальными ограничениями в настоящее время не поддерживаются в EF, но, похоже, они планируют это для будущего выпуска.

http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx?wa=wsignin1.0&CommentPosted=true#commentmessage

...