代码之家  ›  专栏  ›  技术社区  ›  Rune

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

  •  9
  • Rune  · 技术社区  · 14 年前

    我遇到过这样一个场景:EntityFramework4.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]
    

    如果我在VisualStudio2010中告诉设计师生成ADO.NET 实体数据模型我得到一个有两个类的模型, 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]
    

    也就是说 我所做的就是使索引成为唯一的索引。这样做之后,当我告诉visualstudio的设计者生成一个实体模型时,用户和组之间的关联并没有显示出来 用户 没有导航属性。检查生成的EDMX文件会发现存储模型根本没有关联。

    有人能解释这是为什么吗?为什么唯一索引阻止EF对关系建模?

    非常感谢。

    2 回复  |  直到 14 年前
        1
  •  12
  •   SQLMenace    14 年前

    唯一索引允许1个空值,主键不允许空值。当一个空值不等于一个空值甚至不等于另一个空值时,如何匹配空值

        2
  •  1
  •   Jon Miller    12 年前

    我也有同样的问题。但是,在我的例子中,我尝试链接到的列不是主键。因此,它不会起作用。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