我遇到了一个场景,其中实体框架4.0不会生成一个关联到由具有唯一索引的表支持的实体,我想知道为什么。EF 4为什么不生成与具有唯一索引的列的FK关系的关联?
基本设置是这样的:比方说,我在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建模关系?
谢谢。
嗯,也许你是对的,但Linq2SQL可以处理这种情况。另外,我可以手动在EDMX中添加适当的AssociationSets等,它会正常工作,所以我仍然不明白EF放弃的原因。 – Rune 2010-08-19 08:26:33
thnaks人很多,我浪费了1个多小时调查为什么导航属性不映射,你的答案帮助我。再次感谢 – 2014-01-28 09:54:10