我遇到了一個場景,其中實體框架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