我有以下实体定义:
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);
}
验证规则如下:
- A
Member
必须属于至少一个Group
- A
Group
必须包含Members
; 如果 aGroup
没有成员,则它必须是包含子组的父组,所有子组必须至少包含一个成员。实际上,子组的成员应由父组继承(但仅在概念上,父组仍应失去实际成员) - 非父级
Group
必须包含至少一个成员
那么,我该如何验证呢?我需要找到所有没有成员的组,检查每个组是否“包含”子组,然后对每个子组递归执行相同的检查,直到我最终得到非父组 - 此时我检查每个组是否包含成员。
我不知道如何优雅地做到这一点。我没有花几个小时盯着可能不正确的代码,绕着圈子编写和重构到遗忘,每隔几分钟就撞到墙上,我决定寻求 StackOverflow 智库的帮助。:)
递归是要走的路,还是有更好的选择?提前致谢。