Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么';EF 4是否为FK关系生成与具有唯一索引的列的关联?_.net_Entity Framework_Sql Server 2008_Entity Framework 4 - Fatal编程技术网

.net 为什么';EF 4是否为FK关系生成与具有唯一索引的列的关联?

.net 为什么';EF 4是否为FK关系生成与具有唯一索引的列的关联?,.net,entity-framework,sql-server-2008,entity-framework-4,.net,Entity Framework,Sql Server 2008,Entity Framework 4,我遇到过这样一个场景: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]

我遇到过这样一个场景: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]
如果我在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]
也就是说,我所做的唯一一件事就是使索引成为唯一的索引。完成此操作后,当我告诉VisualStudio的设计器生成实体模型时,用户和组之间的关联不会显示,
用户
没有导航属性。检查生成的EDMX文件会发现存储模型根本没有关联

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


谢谢。

唯一索引允许1个空值,主键不允许空值。如果没有任何值等于空值,那么如何匹配空值?即使是另一个空值,我也有同样的问题。但是,在我的例子中,我尝试链接到的列不是主键。因此,它不会起作用。EDMX文件无法编译,因为它必须链接到主键。这是有道理的。我遇到这个问题的唯一原因是我正在处理一个设计糟糕的遗留数据库


但是,在您的情况下,您正在标识列上创建唯一索引。为什么?标识列保证是唯一的。此外,它是您的主键,默认情况下,主键上会有一个索引

我发现了这个链接,它解释了EF中目前不支持与唯一约束的关联,但是,看起来他们正在为将来的版本规划它


嗯,也许你是对的,但是Linq2SQL可以处理这种情况。另外,我可以手动在EDMX中添加适当的关联集等,它会很好地工作,所以我仍然不明白EF为什么会放弃。thnaks man alot,我花了1个多小时调查导航属性为何不映射,你的答案帮了我的忙。再次感谢“为什么?身份栏保证是唯一的。”不,不是。使用
SET IDENTITY\u INSERT
或使用
DBCC RESEED
可以复制值。嗯,是的,但是,你必须用自己的方式来做。当你这样做时,这是故意的。我回答说“一个标识列无论如何都是唯一的。”这意味着不可能得到重复的值,但你现在说的真正意思是不可能意外地得到重复的值。这可能是真的(我不完全确定),但这是一个较弱的说法,如果多个应用程序在同一个数据库上工作,这意味着列是唯一的假设可能是无效的,因为另一个应用程序上的另一个用户可能故意插入了一个您不希望的重复值。不过,您认为主键上的唯一索引是无用的观点是正确的,所以即使我不同意您的一个原因,我也同意您的结论。