我有一个自引用的表来创建层次结构。
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中有效,但实体框架似乎遇到了问题。即使我尝试了一个简单的枚举,例如:
foreach(var t in container.Topics) {
Console.WriteLine(t);
}
我收到错误:
'Topic'上的'ParentTopicID'属性无法设置为'null' 值。您必须将此属性设置为“Guid”类型的非null值。
第二个问题是查询此表以查找特定主题的根节点或子节点。
在SQL中,它会像Where ParentTopicID is null
一样简单,但由于.Net中的Guid不为空,因此Linq语法会抱怨并且找不到任何匹配项。
答案 0 :(得分:1)
是的,这里的问题是您的问题为ParentTopicID指定了NULL但在EF Designer中您可能将ParentTopicID设置为可为空。首先改变它,如果它没有解决它我们可以从那里去。
在设计器中,选择类,选择ParentTopicID,按F4选择属性。