为什么EF 4不会为具有唯一索引的列生成FK关联关联?

时间:2010-08-18 10:29:57

标签: .net entity-framework sql-server-2008 entity-framework-4

我遇到过一个场景,其中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实体数据模型,我会得到一个包含两个类的模型,UserGroupUser具有导航属性叫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对关系进行建模?

谢谢。

2 个答案:

答案 0 :(得分:12)

唯一索引允许1 NULL值,主键不允许NULLS。当没有任何东西等于NULL而不是另一个NULL时,你将如何匹配NULL

答案 1 :(得分:1)

我有同样的问题。但是,就我而言,我尝试链接的列不是主键。因此,它不会起作用。 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