code first实现自关联(树结构数据)

时间:2021-08-20 13:27:50

实现自关联数据时,有两点须注意:

1.外键字段必须设置为可为空的值类型(如int?;Guid?等)

2.设置映射时不能级联删除,要设置WillCascadeOnDelete(false)

二话不说了,直接来代码:

一.部门实体:

///   <summary>
        
///  部门名
        
///   </summary>
         public  string Name {  getset; }

         ///   <summary>
        
///  部门编号
        
///   </summary>
         public  string Code {  getset; }

         ///   <summary>
        
///  父级部门ID
        
///   </summary>
          public  Guid? ParentId {  getset; }

         ///   <summary>
        
///  部门顺序号(同级)
        
///   </summary>
         public  int Order {  getset; }

         ///   <summary>
        
///  父级部门
        
///   </summary>
         public  virtual Department ParentDepartment {  getset; }

         ///   <summary>
        
///  当前部门下的员工(不包含子部门的)
        
///   </summary>
         public  virtual ICollection<Employee> Employees {  getset; }

         ///   <summary>
        
///  当前部门的子部门(不包含子部门的下级部门)
        
///   </summary>
         public  virtual ICollection<Department> ChildrenDepartments {  getset; }

二.实体的映射配置

public  class DepartmentEntityConfig:EntityTypeConfiguration<Department>
    {
         #region 成员变量

         #endregion

         #region 构造函数

         public DepartmentEntityConfig()
        {
             this.HasKey(d => d.Id);

             this.Property(d => d.Name)
                .IsRequired()
                .HasMaxLength( 50);

             this.Property(d => d.Code)
                .IsRequired()
                .HasMaxLength( 10);

             this.Property(d => d.Order)
                .IsRequired();

             this.Property(d => d.ParentId)
                .IsOptional();

             this.HasOptional(d => d.ParentDepartment)
                .WithMany(c => c.ChildrenDepartments)
                .HasForeignKey(d => d.ParentId)
                 .WillCascadeOnDelete( false );
               

             this.ToTable( " Department ");
        }

         #endregion

         #region 属性

         #endregion

         #region 方法

         #endregion
    }

 一定注意加红色的部分,搞了我好久