2014-06-17 13 views
5

ich eine Frage zu haben, wie eine Tabelle Beziehung in Microsoft SQL-Server 2012Eltern-Kind-Eins-zu-Eins-Beziehung derselben Tabelle

ich zu erkennen, habe eine Tabelle (MyTable), die ein Eltern-/Kind halten sollen Struktur. Ein Elternteil kann ein Kind haben und ein Kind hat nur ein Elternteil. Dies ist eine klassische Eins-zu-Eins-Beziehung. Der oberste Eintrag hat offensichtlich keinen Elternteil. (Dies wird über eine Nullable-Eigenschaft modelliert)

Wenn ich versuche, dies in MS-SQL zu modellieren, erhalte ich eine Tabelle wie folgt.

Generated From EntityFramework

Hier ist mein Code:

CREATE TABLE [dbo].[MyTable](
    [Id] [uniqueidentifier] PRIMARY KEY NOT NULL, 
    [Name] [nvarchar](200) NOT NULL, 
    [ParentObjectId] [uniqueidentifier] NULL 
) 

GO 

ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_ParentObject] FOREIGN KEY([ParentObjectId]) 
REFERENCES [dbo].[MyTable] ([Id]) 
GO 

ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [Unique_ParentId] UNIQUE(ParentObjectId) 
GO 

ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_ParentObject] 
GO 

Die Uniqe Constraint sollte sicherstellen, dass höchstens ein Elternteil es für ein Kind ist.

ABER Entity Framework lässt mich nicht die Eigenschaften ändern, um eine Eins-zu-Eins-Beziehung zu sein. Es erzeugt immer eine Eins-zu-viele-Beziehung.

BEARBEITEN: Der Code ist DB-First.

Haben Sie eine Idee, wie Sie das in MS-SQL und EntityFramework richtig modellieren können?

+0

Können Sie EF Definition/Entities anzeigen? – ChrFin

+0

Per Definition meinen Sie den generierten Code oder die visuelle Darstellung in VisualStudio einschließlich der Eigenschaften (.edmx-Datei)? – sternze

+1

Oh - DB-zuerst. Ich habe Code-First angenommen. Sorry kann nicht mit DB-First helfen - ich bin allergisch gegen * .edmx Dateien ... – ChrFin

Antwort

4

Sie können in EF leider nicht machen, was Sie wollen.

EF unterstützt nur Eins-zu-Eins-Zuordnungen, wenn ein gemeinsamer Primärschlüssel vorhanden ist (dh beide Tabellen müssen denselben Primärschlüssel haben und einer muss ein Fremdschlüssel des anderen sein). Sie können dies nicht tun, wenn Sie aus naheliegenden Gründen eine Tabelle mit Selbstreferenz verwenden.

Der Grund, warum EF dies nicht unterstützt, ist, dass EF keine eindeutigen Integritätsbedingungen unterstützt. Daher kann nicht sichergestellt werden, dass die 1: 1-Zuordnung eingeschränkt ist. Dies könnte sich ändern, da EF jetzt eindeutige Indizes unterstützt. Dies hat jedoch die Anforderung für gemeinsam genutzte Primärschlüssel nicht von eins zu eins geändert.

Das Beste, was Sie tun können, ist eine Eins zu viele zu erstellen.

+0

Gute informative Antwort, danke .. Ich endete mit einer eins zu viele Beziehung, wie Sie vorgeschlagen .. – sternze

+0

+1 Dies ist die einzige echte Antwort, die ich zu diesem Problem gesehen habe. EF hält mich weiterhin enttäuscht ... – Daniel

+0

@Daniel - EF ist jetzt Community gepflegt, obwohl es immer noch von MS-Mitarbeitern verwaltet wird. Wenn diese Funktion für Sie wichtig ist, empfehle ich, zur Codeplex-Site zu gehen und teilzunehmen. Ich glaube, da ist ein offenes Thema ... –

-2

Sie sollten die übergeordnete Tabelle zunächst erstellen und dann die untergeordnete Tabelle wie diese

Elternteil Table/ Autos/ CarID/ Farbe/

Kindertisch/ Marke/ zu diesem so etwas beziehen MakeID/ Marke/ CarID/

, wenn Sie es auf diese Weise beziehen Sie die richtige Beziehung zwischen einem Elternteil und Kind erreichen

+0

Ich weiß was du meinst, aber das war nicht meine Absicht .. Ich war in der Lage, die Tabellen in DB zu modellieren, aber EF konnte es nicht korrekt darstellen. – sternze

Verwandte Themen