2

我有以下实体定义:

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);
}

验证规则如下:

  • AMember 必须属于至少一个Group
  • AGroup 必须包含Members; 如果 aGroup没有成员,则它必须是包含子组的父组,所有子组必须至少包含一个成员。实际上,子组的成员应由父组继承(但仅在概念上,父组仍应失去实际成员)
  • 非父级Group 必须包含至少一个成员

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

我不知道如何优雅地做到这一点。我没有花几个小时盯着可能不正确的代码,绕着圈子编写和重构到遗忘,每隔几分钟就撞到墙上,我决定寻求 StackOverflow 智库的帮助。:)

递归是要走的路,还是有更好的选择?提前致谢。

4

0 回答 0