实体框架和自引用表

时间:2012-07-22 11:05:57

标签: entity-framework-4 linq-to-entities guid

我有一个自引用的表来创建层次结构。

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语法会抱怨并且找不到任何匹配项。

1 个答案:

答案 0 :(得分:1)

是的,这里的问题是您的问题为ParentTopicID指定了NULL但在EF Designer中您可能将ParentTopicID设置为可为空。首先改变它,如果它没有解决它我们可以从那里去。

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