階層を作成するために自己参照するテーブルがあります。
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])
「ルート」ノードの場合、ParentTopicID
は null になり、子は適切な を指しますTopicID
。
この構造は SQL で機能しますが、Entity Framework には問題があるようです。次のような単純な列挙を試しても、
foreach(var t in container.Topics) {
Console.WriteLine(t);
}
エラーが発生します:
「トピック」の「ParentTopicID」プロパティを「null」値に設定できませんでした。このプロパティは、'Guid' 型の null 以外の値に設定する必要があります。
2 番目の問題は、このテーブルにクエリを実行して、特定のトピックのルート ノードまたは子を見つけることです。
SQL では単純Where ParentTopicID is null
ですが、Guid は .Net では null ではないため、Linq 構文は不平を言い、一致するものは見つかりません。