递归处理自引用实体的算法

时间:2012-05-27 22:50:14

标签: c#-4.0 recursion entity-framework-4.3

我有以下实体定义:

public class Member
{
  [Key] public int Id { get; set; }
  [Required] public string Name { get; set; }

  [Required] public ICollection<Group> Groups { get; set; } // Must be a member of at least one group
}

public class Group
{
  [Key] public int Id { get; set; }
  [Required] public string Name { get; set; }

  public int? ParentGroupId { get; set; }
  public Group ParentGroup { get; set; }

  public ICollection<Member> Members { get; set; } // Must contain at least one member (unless it contains subgroups - see below)
}

Fluent映射配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Many-to-Many Group <--> Member
    modelBuilder.Entity<Group>()
      .HasMany(g => g.Members)
      .WithMany(m => m.Groups)
      .Map(map =>
            {
              map.ToTable("GroupMembers");
              map.MapLeftKey("GroupId");
              map.MapRightKey("MemberId");
            });

    // Self-referencing Group to allow for hierarchy of groups
    modelBuilder.Entity<Group>()
      .HasOptional(g => g.ParentGroup)
      .WithMany()
      .HasForeignKey(pg => pg.ParentGroupId);
}

验证规则如下:

  • Member 必须属于至少一个Group
  • Group 必须包含Members;如果Group没有成员,那么必须是包含子组的父组,所有必须包含至少一个成员。实际上,子组的成员应该由父组继承(但从概念上讲,父组仍然应该没有实际成员)。
  • 非父Group 必须至少包含一名成员

那么,我该如何验证呢?我需要找到没有成员的所有群组,检查每个群组是否包含&#34;子组,然后递归地对每个子组执行相同的检查,直到我最终得到非父组 - 此时我检查每个组是否包含成员。

我不知道如何优雅地做到这一点。而不是花费数小时盯着可能不正确的代码,绕着圈子写作和重构成遗忘,并且每隔几分钟就撞到我的头上,我决定寻求智囊团的帮助那就是StackOverflow。 :)

递归是可行的,还是有更好的选择?提前谢谢。

0 个答案:

没有答案