9

Ich habe in einem Szenario, in dem Entity Framework 4.0 keine Zuordnung zu einer Entität erstellt, die von einer Tabelle mit einem eindeutigen Index generiert wird, und ich frage mich, warum.Warum erzeugt EF 4 keine Assoziation für eine FK-Beziehung zu einer Spalte mit einem eindeutigen Index?

Die Grundeinstellung ist dies: Sagen wir, ich habe zwei Tabellen in SQL Server 2008 R2 und ein Fremdschlüssel Beziehung:

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

Darüber hinaus ist der folgende Index annehmen vorhanden:

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] 

Wenn ich den Designer in Visual Studio 2010 anrufe, ein ADO.NET-Entitätsdatenmodell zu generieren, erhalte ich ein Modell mit zwei Klassen User und Group, User mit einer Navigationseigenschaft namens Group. Das ist alles in Ordnung und gut.

Nun lassen Sie uns stattdessen sagen, dass der Index sah wie folgt aus:

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] 

Das heißt, die nur, was ich getan habe, ist der Index ein eindeutiger Index zu machen. Wenn ich dem Visual Studio-Designer sage, dass er ein Entitätsmodell generieren soll, wird die Zuordnung zwischen Benutzern und Gruppen nicht angezeigt, und die User hat keine Navigationseigenschaften. Die Überprüfung der generierten EDMX-Datei zeigt, dass das Speichermodell überhaupt kein AssociationSet hat.

Kann jemand erklären, warum das ist? Warum verhindert der eindeutige Index, dass EF die Beziehung modelliert?

Vielen Dank.

Antwort

12

Ein eindeutiger Index ermöglicht 1 NULL-Wert, ein Primärschlüssel lässt NULL nicht zu. Wie werden Sie die NULL übereinstimmen, wenn nichts gleich NULL ist, nicht einmal ein weiterer NULL

+0

Hmm, vielleicht haben Sie recht, aber Linq2SQL dieses Szenario umgehen kann. Außerdem kann ich passende AssociationSets etc. in der EDMX per Hand hinzufügen und es wird gut funktionieren, so dass ich immer noch nicht verstehe, warum EF aufgibt. – Rune

+0

thnaks man viel, ich verschwendete mehr als 1 Stunde zu untersuchen, warum Navigationseigenschaften nicht zuordnen, hat Ihre Antwort mir geholfen. Nochmals vielen Dank –

1

Ich habe das gleiche Problem. In meinem Fall ist die Spalte, mit der ich eine Verknüpfung herstellen möchte, jedoch nicht der Primärschlüssel. Daher wird es nicht funktionieren. Die EDMX-Datei wird nicht kompiliert, indem sie sagt, dass sie mit einem Primärschlüssel verknüpfen muss. Das macht Sinn. Der einzige Grund, warum ich auf das Problem stoße, ist, dass ich es mit einer veralteten Datenbank zu tun habe, die schlecht entworfen wurde.

In diesem Fall erstellen Sie jedoch einen eindeutigen Index für eine Identitätsspalte. Warum? Eine Identitätsspalte ist sowieso garantiert eindeutig. Außerdem ist es Ihr Primärschlüssel, für den standardmäßig ein Index vorhanden ist.

Ich habe diesen Link gefunden, der erklärt, dass Verknüpfungen zu eindeutigen Integritätsbedingungen derzeit in EF nicht unterstützt werden, aber es sieht so aus, als würden sie für eine zukünftige Version geplant werden.

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

+0

"Warum? Eine Identitätsspalte ist garantiert sowieso einzigartig." Nein, ist es nicht. Doppelte Werte sind mit 'SET IDENTITY_INSERT' oder mit' DBCC RESEED' möglich. – hvd

+0

Äh, ja, aber, du musst dir etwas aus dem Weg gehen. Wenn Sie das tun, ist es beabsichtigt. –

+0

Ich antwortete: "Eine Identitätsspalte ist sowieso garantiert einzigartig."Das heißt, es ist unmöglich, doppelte Werte zu erhalten, aber was Sie jetzt sagen, dass Sie wirklich meinen, dass es unmöglich ist, doppelte Werte zufällig zu erhalten. Das mag wahr sein (ich bin mir nicht ganz sicher), aber es ist viel schwächer Anspruch und wenn Mehrere Anwendungen arbeiten an der gleichen Datenbank, dh die Annahme, dass die Spalte eindeutig ist, kann ungültig sein, weil ein anderer Benutzer in einer anderen Anwendung absichtlich einen doppelten Wert eingefügt haben könnte, den Sie nicht erwartet haben – hvd

Verwandte Themen