我有一个自引用以创建层次结构的表。
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 语法会抱怨并且找不到任何匹配项。