实现自关联数据时,有两点须注意:
1.外键字段必须设置为可为空的值类型(如int?;Guid?等)
2.设置映射时不能级联删除,要设置WillCascadeOnDelete(false)
二话不说了,直接来代码:
一.部门实体:
///
<summary>
/// 部门名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 部门编号
/// </summary>
public string Code { get; set; }
/// <summary>
/// 父级部门ID
/// </summary>
public Guid? ParentId { get; set; }
/// <summary>
/// 部门顺序号(同级)
/// </summary>
public int Order { get; set; }
/// <summary>
/// 父级部门
/// </summary>
public virtual Department ParentDepartment { get; set; }
/// <summary>
/// 当前部门下的员工(不包含子部门的)
/// </summary>
public virtual ICollection<Employee> Employees { get; set; }
/// <summary>
/// 当前部门的子部门(不包含子部门的下级部门)
/// </summary>
public virtual ICollection<Department> ChildrenDepartments { get; set; }
/// 部门名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 部门编号
/// </summary>
public string Code { get; set; }
/// <summary>
/// 父级部门ID
/// </summary>
public Guid? ParentId { get; set; }
/// <summary>
/// 部门顺序号(同级)
/// </summary>
public int Order { get; set; }
/// <summary>
/// 父级部门
/// </summary>
public virtual Department ParentDepartment { get; set; }
/// <summary>
/// 当前部门下的员工(不包含子部门的)
/// </summary>
public virtual ICollection<Employee> Employees { get; set; }
/// <summary>
/// 当前部门的子部门(不包含子部门的下级部门)
/// </summary>
public virtual ICollection<Department> ChildrenDepartments { get; set; }
二.实体的映射配置
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
}
{
#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
}
一定注意加红色的部分,搞了我好久