2012-07-22 2 views
2

J'ai une table qui auto-référence pour créer une hiérarchie.Entity Framework et table d'auto-référence

CREATE TABLE [dbo].[Topics](
    [ID] [uniqueidentifier] NOT NULL, 
    [ParentTopicID] [uniqueidentifier] NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    CONSTRAINT [PK_Topics] 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] 

GO 

ALTER TABLE [dbo].[Topics] WITH CHECK ADD CONSTRAINT [FK_Topics_Topics] 
FOREIGN KEY([ParentTopicID]) REFERENCES [dbo].[Topics] ([ID]) 

Pour les noeuds « root », le ParentTopicID sera nulle, et les enfants pointera vers appropriés TopicID.

Cette structure fonctionne en SQL mais Entity Framework semble avoir des problèmes avec cela. Même si je tente une énumération simple comme:

foreach(var t in container.Topics) { 
    Console.WriteLine(t); 
} 

Je reçois une erreur:

The 'ParentTopicID' property on 'Topic' could not be set to a 'null' value. You must set this property to a non-null value of type 'Guid'.

Le deuxième problème est d'interroger ce tableau pour trouver les nœuds racines ou enfants d'un sujet particulier.

En SQL, ce serait simple comme Where ParentTopicID is null mais comme Guid n'est pas nul dans .Net, la syntaxe Linq se plaint et ne trouve aucune correspondance.

Répondre

1

Oui, le problème ici est que votre problème a NULL spécifié pour ParentTopicID mais dans EF Designer, vous avez probablement défini ParentTopicID sur nullable false. Changez cela en premier et nous pouvons partir de là s'il ne le répare pas.

Dans le concepteur, sélectionnez la classe, sélectionnez ParentTopicID, appuyez sur F4 pour les propriétés.

+0

J'ai essayé mais cela entraîne l'erreur suivante: Erreur 113: la multiplicité n'est pas valide dans le rôle 'Sujet' dans la relation 'FK_Topics_Topics'. Comme toutes les propriétés du rôle dépendant sont nulles, la multiplicité du rôle principal doit être '0..1' – VV75

+0

C'est bien. Cela signifie simplement que vous avez une relation qui est définie sur 1..1 au lieu de 0..1. Vous devez modifier le point de fin de la relation afin de dire que quelque chose comme un sujet peut avoir 0 ou 1 sujets. – Ian

+0

Peu importe, votre suggestion originale a fonctionné. J'ai reconstruit le modèle et ensuite appliqué votre suggestion et je ne reçois aucune erreur de compilation ou d'exécution. Merci beaucoup. – VV75