9

Varlık Framework 4.0'ın benzersiz endeksine sahip bir tablo tarafından desteklenen bir varlık için bir ilişki oluşturmadığı bir senaryoda karşılaştım ve nedenini merak ediyorum. Diyelim ki, SQL Server 2008 R2 ve yabancı anahtar ilişkisi içinde iki tablo var diyelim:Neden EF 4, benzersiz dizine sahip sütuna FK ilişkisi için ilişki oluşturmuyor?

temel kurulum şudur Üstelik

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]) 

aşağıdaki indeksi varsayalım mevcuttur:

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'da tasarımcıya bir ADO.NET Varlık Veri Modeli oluşturduğumu bildirirseniz, User ve Group, User numaralı Group adlı Gezinme Özelliğine sahip bir model alır. Hepsi iyi ve iyi.

Şimdi, indeks bu benziyordu yerine varsayalım:

olduğunu
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] 

, Yaptığım sadece şey indeksi benzersiz bir dizin açmak. Bunu yaptıktan sonra, Visual Studio'nun tasarımcısına bir Varlık Modeli oluşturduğunu söylediğimde, kullanıcılar ve gruplar arasındaki ilişki görünmez ve User hiçbir gezinme özelliğine sahip değildir. Oluşturulan EDMX dosyasını incelemek, depolama modelinin hiçbir AssociationSet'e sahip olmadığını ortaya çıkarır. Bu yüzden

Herkes açıklayabilir misiniz? Benzersiz endeks neden EF'in ilişkiyi modellemesini engelliyor?

Teşekkür ederiz.

cevap

12

Benzersiz bir dizin 1 NULL değerine izin verir, bir birincil anahtar NULLS'a izin vermez. Hiçbir şey NULL eşit değil NULL bile bir NULL

+0

Hmm, belki haklısınız ama Linq2SQL bu senaryoyu işleyebilir. Ayrıca, EDMX'e uygun AssociationSets vb .'yi el ile ekleyebilirim ve gayet iyi çalışıyor, bu yüzden EF'in neden vazgeçtiğini anlamıyorum. – Rune

+0

bir sürü adam, ben navigasyon özellikleri neden haritalama değil, soruşturma bana yardımcı olduğunu araştırıyor 1 saatten fazla israf etti. tekrar teşekkürler –

1

Ben aynı sorun var NULL eşleştireceksiniz. Ancak, benim durumumda, bağlantı kurmaya çalıştığım sütun birincil anahtar değil. Bu yüzden işe yaramaz. EDMX dosyası, bir birincil anahtara bağlanması gerektiğini söyleyerek derlenmez. Bu mantıklı. Soruna girmemin tek nedeni, kötü tasarlanmış bir eski veritabanıyla uğraşmak olduğum. Ancak, durumda, bir kimlik sütununda benzersiz bir dizin oluşturuyorsunuz. Niye ya? Yine de bir kimlik sütununun benzersiz olması garanti edilir. Ayrıca, varsayılan olarak üzerinde bir dizin olacak birincil anahtarınız.

Benzersiz kısıtlamalarla ilişkilendirmelerin şu anda EF'de desteklenmediğini açıklayan bu bağlantıyı buldum, ancak gelecekteki bir sürüm için plan yapıyor gibi görünüyor.

http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx?wa=wsignin1.0&CommentPosted=true#commentmessage

+0

"Neden? Bir kimlik sütununun her zaman benzersiz olması garanti edilir." Hayır değil. “IDENTITY_INSERT” ile veya “DBCC RESEED” ile çift değerler mümkündür. – hvd

+0

Uh, evet, ama bunu yapmak için yoldan çıkmalısın. Bunu yaptığınızda, kasıtlı. –

+0

"Bir kimlik sütununun her zaman benzersiz olması garanti edilir."Bu, çift değerleri elde etmek imkansız olduğu anlamına geliyor, ama şimdi gerçekten kastettiğiniz şey, kasten değerlerin kaza ile elde edilmesinin imkansız olduğu anlamına geliyor. Bu doğru olabilir (tamamen emin değilim), ancak daha zayıf bir iddia ve eğer Birden çok uygulama aynı veritabanı üzerinde çalışıyor, başka bir uygulamada başka bir kullanıcı kasıtlı olarak beklemediğiniz bir yinelenen değer eklediğinden, sütunun benzersiz olduğu varsayımı geçersiz olabilir – hvd

İlgili konular