我遇到过一个场景,其中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]
也就是说,我所做的唯一事情是使索引成为唯一索引。完成此操作后,当我告诉Visual Studio的设计人员生成实体模型时,用户和组之间的关联不会显示,User
没有导航属性。检查生成的EDMX文件显示存储模型根本没有AssociationSet。
任何人都能解释为什么会这样吗?为什么唯一索引会阻止EF对关系进行建模?
谢谢。
答案 0 :(得分:12)
唯一索引允许1 NULL值,主键不允许NULLS。当没有任何东西等于NULL而不是另一个NULL时,你将如何匹配NULL
答案 1 :(得分:1)
我有同样的问题。但是,就我而言,我尝试链接的列不是主键。因此,它不会起作用。 EDMX文件将无法编译,表明它必须链接到主键。这是有道理的。我遇到问题的唯一原因是我正在处理设计不佳的遗留数据库。
但是,在您的情况下,您将在标识列上创建唯一索引。为什么?无论如何,保证标识列是唯一的。此外,它是您的主键,默认情况下会有一个索引。
我发现这个链接解释了EF目前不支持与唯一约束的关联,但看起来他们正计划将来发布。