我有以下实体定义:
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。 :)
递归是可行的,还是有更好的选择?提前谢谢。