Entity framework 4 实体框架与自引用表

Entity framework 4 实体框架与自引用表,entity-framework-4,linq-to-entities,guid,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 ( PA

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

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中工作,但实体框架似乎在这方面存在问题。即使我尝试一个简单的枚举,例如:

foreach(var t in container.Topics) {
    Console.WriteLine(t);
}
我得到一个错误:

“主题”上的“ParentTopicID”属性无法设置为“null” 价值必须将此属性设置为“Guid”类型的非空值

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


在SQL中,如果ParentTopicID为null,这将很简单,但由于.Net中的Guid不是null,Linq语法会发出抱怨,并且找不到任何匹配项。

是的,这里的问题是您的问题为ParentTopicID指定了null,但在EF Designer中,您可能已将ParentTopicID设置为null false。先改变它,如果它不能解决问题,我们可以从那里开始


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

我尝试过,但结果出现以下错误:错误113:多重性在关系“FK\U Topics\U Topics”中的角色“Topic”中无效。因为依赖角色中的所有属性都可以为null,所以主体角色的多重性必须为“0..1”,这很好。这只是意味着你的关系被设置为1..1而不是0..1。您需要更改关系的结束点,使其显示一个主题可以有0或1个主题。没关系,您最初的建议有效。我重建了模型,然后应用了您的建议,我没有得到任何编译或运行时错误。非常感谢。