2

階層を作成するために自己参照するテーブルがあります。

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 構文は不平を言い、一致するものは見つかりません。

4

1 に答える 1

1

はい、ここでの問題は、問題で ParentTopicID に NULL が指定されていることですが、EF デザイナーでは、ParentTopicID が nullable false に設定されている可能性があります。最初にそれを変更してください。問題が解決しない場合は、そこから先に進むことができます。

デザイナーで、クラスを選択し、ParentTopicID を選択し、F4 キーを押してプロパティを表示します。

于 2012-07-22T11:10:03.813 に答える