对于一般的目录树,通常就是一对多的自反关系,一般会有一个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. 【[JSOI2007]建筑抢修】

    各种瞎写 之后也不知道为什么就过了 刚看到这道题感觉确实是不会的,因为我贪心太差了\(QAQ\) 之后就随便\(yy\)呗 发现首先我们得排一下序,以\(t2\)也就是建筑的损坏时间为第一关键字从小到 ...

  2. 1. Docker基础命令

    本文简要介绍Docker的基础命令,目的在于快速入门Dokcer,Docker的完整命令可以参考Docker官方手册. 0. 安装Docker Docker当前分为企业版(Docker Enterpr ...

  3. TensorFlow函数(五)参数初始化方法

    1.初始化为常量 tf.constant_initializer(value, dtype) 生成一个初始值为常量value的tensor对象 value:指定的常量 dtype:数据类型 tf.ze ...

  4. TensorFlow函数(二)tf.get_variable() 和 tf.Variable()

    tf.Variable(<initial - value>,name=<optional - name>) 此函数用于定义图变量.生成一个初始值为initial - value ...

  5. 2、Android-UI(布局待完成)

    2.3.布局 实现界面的整齐摆放各种控件需要使用布局来完成 布局是一种可用于放置很多控件的容器 可以按照一定的规律调整内部的控件位置 布局的内部不仅可以放置控件还可以放置布局 1.线性布局 Linea ...

  6. php json格式化输出

    1.json格式是适用于多种语言的数据格式,通用性高 2.在php中将array格式的数据转化为json格式 3.默认情况下转化后的json格式为一个串,需要将这个串格式化成相应的样式输出 主要的函数 ...

  7. Struts2通配符

    action: struts: or: 请求路径:

  8. CS20Chapter3

    waiting  P54 shuffle data 03_Lecture note_Linear and Logistic Regression 学习点1: python的地址输入是要不能用正斜杠\的 ...

  9. RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态

    场景 现有节点Node1和Node2,建立Exchange:yu.exchange,创建队列yu1.queue镜像队列master位于Node1,yu2.queue镜像队列位于Node2,使用topi ...

  10. Hibernate工作原理及为什么要用?. Struts工作机制?为什么要使用Struts? spring工作机制及为什么要用?

    三大框架是用来开发web应用程序中使用的.Struts:基于MVC的充当了其中的试图层和控制器Hibernate:做持久化的,对JDBC轻量级的封装,使得我们能过面向对象的操作数据库Spring: 采 ...