对于一般的目录树,通常就是一对多的自反关系,一般会有一个PID,引用于这个ID,实体类代码类似于下:

public partial class Catalog

{

    public Catalog()

    {

        this.References = new List<Reference>();

        this.Children = new List<Catalog>();

    }

 

    public string CatalogID { get; set; }

    public string CatalogName { get; set; }

    public string CatalogPID { get; set; }

    public ICollection<Reference> References { get; set; }

 

    public virtual Catalog Parent { get; set; }

    public virtual ICollection<Catalog> Children { get; set; }

}

        实体类中会有一个孩子节点的集合,然后有一个父节点的实体;Map文件映射如下:

public CatalogMap()

{

    // Primary Key

    this.HasKey(t => t.CatalogID);

 

    // Properties

    this.Property(t => t.CatalogID)

        .IsRequired()

        .HasMaxLength(36);

 

    this.Property(t => t.CatalogName)

        .HasMaxLength(100);

 

    this.Property(t => t.CatalogPID)

       .IsOptional();

 

    // Table & Column Mappings

    this.ToTable("Catalog");

    this.Property(t => t.CatalogID).HasColumnName("CatalogID");

    this.Property(t => t.CatalogID).HasColumnName("CatalogPID");

    this.Property(t => t.CatalogName).HasColumnName("CatalogName");

 

 

    //Relationships

    //this.HasMany(t => t.References)

    //    .WithOptional(t => t.Catalog)

    //    .HasForeignKey(d => d.CatalogID);

 

    this.HasOptional(t => t.Parent)

        .WithMany(t => t.Children)

        .HasForeignKey(d => d.CatalogPID);

}

       一定要注意以下的这段代码:

this.Property(t => t.CatalogPID)

            .IsOptional();

        它的意思是允许这个外键为空,因为一般情况下,根结点的父ID一般都会为空。如果设置为必须的话,那么根结点的父ID就不知道设置成什么值了。否则的话,在程序中就会报错:“because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be 1”.

       参考资料:http://www.cnblogs.com/libingql/p/3353112.html#5

EF中一对多的自反关系设置的更多相关文章

  1. EF中一对多的关系中,用单字段保存ID拼接字符串

    model.SubjectTerms = model.SelectedSubjectTerm.Trim(',').Split(',').ToList().Select(x => new Subj ...

  2. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  3. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  4. DB表的关系及EF中Fluent API的使用

    现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...

  5. EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  6. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

  7. angularjs中的页面访问权限设置

    11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangD ...

  8. EF中限制字段显示长度

    在EF中有些添加的字段 文本显示超多文字,想截取显示又没有截取功能. 怎么办? 我们可以在EF中类的属性中设置 你想限制这个用户名只能有10个字符长度 public String UserName { ...

  9. EF中逆变和协变

    EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...

随机推荐

  1. IE8崩溃在CElement::GetUpdatedLayoutWithContext

    发了一个我们页游助手的版本时,测试报告在某些机器上点开某网站时崩溃 "0x637e5067指令引用的0x00000008内存,该内存不能为read",查看dump文件,堆栈如下: ...

  2. ssrf绕过记录

    第一道题来自2018 上海市大学生网络安全大赛线上赛web01 if(isset($_POST['url']) && parse_url($_POST['url'])['host']= ...

  3. Sublime Text 3中文乱码问题解决

    Sublime Text 3是我MacBook Pro最喜欢的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开GBK的代码文件,如果里面有中文 ...

  4. 为什么要使用GetSafeHwnd()函数

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...

  5. Mac下python3配置Sklearn

    服务器要有Python 环境 ,也要有Python运行的依赖包,Java与Python使用Process进程进行通讯. 安装homebrew /usr/bin/ruby -e "$(curl ...

  6. e2fsprogs

    开源文件系统ext2/ext3/ext4管理工具e2progs包含的工具组件: 1.debugfs: ext2/ext3/ext4文件系统调试工具.debugfs是一个交互式的文件系统调试工具,可以用 ...

  7. 并发编程(四)------并发quene

    在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue接口! Con ...

  8. 在VSCode使用Markdown绘制UML图

    在VSCode使用Markdown绘制UML图 需要插件 Markdown All in One Markdown Preview Enhanced PlantUML markdownlint Mar ...

  9. 不可变字符串String与可变字符串StringBuilder、StringBuffer使用详解

    String字符串 char类型只能表示一个字符,而String可以表示字符串,也就是一个字符序列.但String不是基本类型,而是一个定义好的类,是一个引用类型.在Java中,可以将字符串直接量赋给 ...

  10. es6解构赋值的几个用法

    1.解构赋值可以轻松获取对象或者数组中的数据 var jsonData = { data: "111", data2: ["test","test2& ...