Asp.net mvc 5 Web Api 2中相同表的外键

Asp.net mvc 5 Web Api 2中相同表的外键,asp.net-mvc-5,foreign-keys,entity-framework-6,asp.net-web-api2,Asp.net Mvc 5,Foreign Keys,Entity Framework 6,Asp.net Web Api2,我有一个数据模型,它有一个通过数据定义的文件夹结构。不同的对象可以位于这些文件夹中,包括文件夹本身,这与资源管理器中的文件夹级联方式类似,并且可以相互包含 我想我已经弄清楚了外键在这个堆栈中是如何工作的,但是当我将它迁移到数据库时,系统不会允许我这样做。有什么问题吗?一定有办法将这些文件夹条目相互嵌套,对吗 namespace api.Models { public class Folder { public int Id { get; set; }

我有一个数据模型,它有一个通过数据定义的文件夹结构。不同的对象可以位于这些文件夹中,包括文件夹本身,这与资源管理器中的文件夹级联方式类似,并且可以相互包含

我想我已经弄清楚了外键在这个堆栈中是如何工作的,但是当我将它迁移到数据库时,系统不会允许我这样做。有什么问题吗?一定有办法将这些文件夹条目相互嵌套,对吗

namespace api.Models
{
    public class Folder
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }

        public int SuperFolderId { get; set; }
        public Folder SuperFolder { get; set; }
    }
}

这里的疏忽是自引用外键不能为空。设想一个文件结构,其中每个文件夹都需要一个超级文件夹。它要么永远上升,要么两个文件夹必须相互引用,然后循环

这与员工拥有经理的典型自引用关键示例相同,其中经理也在员工表中。在你到达公司的领导层之前,你只能走得更远

系统假定外键不可为空,因此它使它们成为必需的,而不需要[required]属性。有时将外键设置为可选是有效的,为此,您可以将int转换为可为null的int,或int?。下面的代码修复了这个问题

namespace api.Models
{
    public class Folder
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }

        public int? SuperFolderId { get; set; }
        public Folder SuperFolder { get; set; }
    }
}