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将为空,子节点将指向适当TopicID的 。

此结构在 SQL 中有效,但 Entity Framework 似乎对此有问题。即使我尝试一个简单的枚举,例如:

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

我收到一个错误:

'Topic' 上的 'ParentTopicID' 属性无法设置为 'null' 值。您必须将此属性设置为“Guid”类型的非空值。

第二个问题是查询该表以查找特定主题的根节点或子节点。

在 SQL 中,这很简单,Where ParentTopicID is null但由于 Guid 在 .Net 中不为空,Linq 语法会抱怨并且找不到任何匹配项。

4

1 回答 1

1

是的,这里的问题是您的问题为 ParentTopicID 指定了 NULL,但在 EF 设计器中,您可能将 ParentTopicID 设置为可为空的 false。首先改变它,如果它不能修复它,我们可以从那里开始。

在设计器中,选择类,选择 ParentTopicID,按 F4 获取属性。

于 2012-07-22T11:10:03.813 回答