2009-02-02 39 views
3

我在我的Linq to SQL dbml中有一个Task实体。它是用ID和ParentID列自引用的。我有一个将两个ID关联在一起的关联。LINQ to SQL:自引用实体 - ParentID/ChildID关联

它似乎在intellisense中一切正常。它会让我输入Task.Parent.ID,甚至Task.Parent.Parent.ID等。但是,它给了我ol'“对象引用未设置为对象的实例。”错误。

我所有的其他协会都可以正常使用我的其他实体。只有自引用实体错误。

有没有什么特别的我需要做的,以使其工作,或者我最好只是添加第二个任务实体,并将其称为ParentTask,并使这种关联?

回答

4

如果您尝试为实体获取父母时发生错误,但实际上没有父母。你指定的一切都很完美,而且我已经多次实现了类似的关系。

你提到了一个例外,但你没有提及它何时发生。更新期间?也许有违反FK的行为?在插入期间?或者只是一个查询?

Task.Parent.Parent.Parent.Parent不是你可以无限地做的事情。当然,它会编译,代码不知道有数据支持该声明。但是在运行时,每个.Parent调用需要由一个等效的ParentID列匹配。

+0

只是一个查询。因此,我从您的评论中了解到,我需要检查以确保父对象先存在,然后如果存在,则显示它。 – EdenMachine 2009-02-02 05:45:58

0

我对LINQ to SQL中正确建模的单表关系没有任何问题。我运行了一个快速测试案例来重现您所描述的内容,并且它工作正常(Item.Parent.ID,Item.Parent.Parent.Parent.Parent.Parent.ID等)

设置SQL事件探查器并查看SQL LINQ提供者正在尝试生成。也可以看看designer.cs文件中的实体类,看看Task上Parent属性的getter是否看起来很奇怪。