2014-06-17 11 views
5

Ho una domanda su come realizzare un rapporto di tabella in Microsoft SQL-Server 2012.padre-figlio one-to-one Relation stessa tabella

Ho una tabella (MyTable), che dovrebbe contenere un padre/figlio struttura. Un genitore può avere un figlio e un bambino ha un solo genitore. Questa è una classica relazione uno a uno. La voce più in alto ovviamente non può avere un genitore. (Questo è modellato tramite una proprietà nullable)

Quando provo a modellare questo in MS-SQL, ricevo una tabella come segue.

Generated From EntityFramework

Ecco il mio codice:

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 

L'Uniqe vincolo dovrebbe assicurare che ci sia al massimo un genitore per un bambino.

MA Entity Framework non mi consente di modificare le proprietà in modo da essere una relazione uno a uno. Genera sempre una relazione uno-a-molti.

MODIFICA: Il codice è DB-First.

Avete qualche idea su come modellarlo correttamente in MS-SQL ed EntityFramework?

+0

Puoi mostrarti definizione/entità EF? – ChrFin

+0

Per definizione, intendi il codice generato o la rappresentazione visiva in VisualStudio comprese le proprietà (.edmx-File)? – sternze

+1

Oh - DB-first. Ho assunto il codice prima. Spiacente non posso aiutare con DB-first - I am agains agains * .edmx files ... – ChrFin

risposta

4

Purtroppo non è possibile fare ciò che si desidera in EF.

EF supporta solo i mapping uno a uno quando è presente una chiave primaria condivisa (ovvero entrambe le tabelle devono avere la stessa chiave primaria e una deve essere una chiave esterna dell'altro). Non è possibile farlo quando si utilizza una tabella autoreferenziale per ovvi motivi.

Il motivo per cui EF non supporta questo è che EF non supporta vincoli univoci, quindi non ha modo di garantire che la mappatura 1: 1 sia vincolata. Questo potrebbe cambiare perché EF ora supporta indici univoci, tuttavia questo non ha cambiato il requisito per le chiavi primarie condivise in uno a uno.

Il meglio che puoi fare è creare uno a molti.

+0

Buona risposta informativa, grazie .. Ho avuto una relazione uno a molti come suggerivi .. – sternze

+0

+1 Questa è l'unica vera risposta che ho visto a questo problema. EF continua a deludermi ... – Daniel

+0

@Daniel - L'EF è ora gestito dalla comunità, sebbene sia ancora gestito dai dipendenti di MS. Se questa funzione è importante per te, ti suggerisco di andare al sito di codeplex e partecipare. Credo che ci sia un problema aperto su questo ... –

-2

Si dovrebbe creare la tabella padre e poi riferire la tabella figlio a che così qualcosa di simile tabella padre

/ Auto/ CARID/ Colore/

bambino tavolo/ Marca/ MakeID/ Make/ CarID/

se lo si riferisce in questo modo si otterrà il corretto rapporto tra genitore e figlio

+0

So cosa intendi, ma questa non era la mia intenzione .. Ero in grado di modellare le tabelle in DB sie, ma EF non era in grado di visualizzarlo correttamente. – sternze