对于一般的目录树,通常就是一对多的自反关系,一般会有一个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. Linux环境搭建多项目SVN

    1.安装SVN #yum install subversion 2.创建版本库文件夹 #mkdir -p /var/svn/repos/pro1 (/var/svn/repos是根路径,pro1是项目 ...

  2. 【nodejs】创建第一个应用

    我已经安装好了nodejs(采用安装包的方式),并在idea中安装好nodejs插件,具体参考我的随笔: http://www.cnblogs.com/yujihang/p/7011356.html ...

  3. python多线程练习

    import threading from time import sleep,ctime def print1(): for i in range(10): print(i,end='') prin ...

  4. OpenGL之位图的绘制和gluOrtho2D等函数详解

    位图绘制 先来段代码吧: #include <iostream> #include <gl/glut.h> using namespace std; #pragma comme ...

  5. [Luogu1282]多米诺骨牌(DP)

    #\(\color{red}{\mathcal{Description}}\) \(Link\) 我们有一堆多米诺骨牌,上下两个部分都有点数,\(But\)我们有一个操作是可以对调上下的点数.若记一块 ...

  6. 错误:maximum number of expressions in a list is 1000

    某一日发现这么如下这么一个错误  --> maximum number of expressions in a list is 1000 原因:因为SQL语句中用到了IN字句,而IN中的元素个数 ...

  7. ASP.NET Core 如何设置发布环境

    在ASP.NET Core中自带了一些内置对象,可以读取到当前程序处于什么样的环境当中,比如在ASP.NET Core的Startup类的Configure方法中,我们就会看到这么一段代码: publ ...

  8. Android之zip文件加密解压及进度条的实现

    zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件 ...

  9. 【转】:Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级

    为方便截图,本文操作都在vmware虚拟机上完成. 目录: 1.操作系统安装 2.数据库安装 3.PSU补丁升级卸载   part1 操作系统安装 Oracle (Enterprise) Linux ...

  10. MySQL数据库创建用户并实现远程登录

    创建用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 2.授权 GRANT privileges_name privileges O ...