9

我遇到了一個場景,其中實體框架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實體數據模型,我將得到一個帶有兩個類的模型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建模關係?

謝謝。

回答

12

唯一索引允許1個NULL值,主鍵不允許NULLS。當沒有任何東西等於NULL時,你將如何匹配NULL甚至沒有另一個NULL

+0

嗯,也許你是對的,但Linq2SQL可以處理這種情況。另外,我可以手動在EDMX中添加適當的AssociationSets等,它會正常工作,所以我仍然不明白EF放棄的原因。 – Rune 2010-08-19 08:26:33

+0

thnaks人很多,我浪費了1個多小時調查爲什麼導航屬性不映射,你的答案幫助我。再次感謝 – 2014-01-28 09:54:10

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

+0

「爲什麼?無論如何,身份列保證是唯一的。」不,它不是。 「SET IDENTITY_INSERT」或「DBCC RESEED」可能有重複的值。 – hvd 2012-02-25 18:25:29

+0

呃,是的,但是,你必須竭盡全力去做到這一點。當你這樣做的時候,這是故意的。 – 2012-05-05 18:13:54

+0

我回應說:「無論如何,一個身份列保證是唯一的。「這意味着你不可能得到重複的價值觀,但是你現在說的你的真正意思是不可能無意中得到重複的價值。這可能是事實(我不完全確定),但是它的要求太差了,如果多個應用程序在同一個數據庫上工作,這意味着假設該列是唯一的可能是無效的,因爲另一個應用程序上的另一個用戶可能有意插入了一個您不期望的重複值。 – hvd 2012-05-05 21:59:05

相關問題