Три класса: Пользователь, Группа и Поле.Отношения «многие ко многим» для пользователя / группы и отношения «многие ко многим» в поле группыОтношения между пользователем и группой довольно просты, так как пользователь просто является членом группы или нет.Отношение Группа / Поле является более сложным, поскольку в этом отношении есть свойство Authority.
В ctor я передаю HashSets отношений, так что есть один мастер.
Напоследок к вопросу.Как лучше отфильтровать группу GroupAuthority?Увидеть ??в коде ниже.
public class Group : Object
{
private HashSet<UserGroup> usersGroups;
private HashSet<GroupFieldAuthority> groupsFieldsAuthority;
public Int16 ID { get; private set; }
public string Name { get; set; }
public List<User> Users
{ get { return usersGroups.Where(x => x.Group == this).Select(x => x.User).OrderBy(x => x.UserID).ToList(); } }
public List<FieldAuthority> FieldsAuthority
{
get
{
// Can this be done more directly??
List<FieldAuthority> fieldsAuthority = new List<FieldAuthority>();
foreach (GroupFieldAuthority gfa in groupsFieldsAuthority.Where(x => x.Group == this).OrderBy(x => x.Group.Name))
{
fieldsAuthority.Add(new FieldAuthority(gfa.FieldDef, gfa.Authority));
}
return fieldsAuthority;
}
}
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
Group fd = (Group)obj;
return (ID == fd.ID);
}
public override int GetHashCode() { return (int)ID; }
public Group(Int16 id, string name, HashSet<UserGroup> UsersGroups, HashSet<GroupFieldAuthority> GroupsFieldsAuthority)
{ ID = id; Name = name; usersGroups = UsersGroups; groupsFieldsAuthority = GroupsFieldsAuthority; }
}
public class GroupFieldAuthority : Object
{
public Group Group { get; private set; }
public FieldDef FieldDef { get; private set; }
public enumAuthRORWMADeny Authority { get; private set; }
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
GroupFieldAuthority item = (GroupFieldAuthority)obj;
return (Group.ID == item.Group.ID);
}
public override int GetHashCode() { return (int)Group.ID ^ (int)FieldDef.ID; }
public GroupFieldAuthority(Group group, FieldDef fieldDef, enumAuthRORWMADeny authority)
{ Group = group; FieldDef = fieldDef; Authority = authority; }
}
public class FieldAuthority : Object
{ // used for FieldDef and Document
public FieldDef FieldDef { get; private set; }
public enumAuthRORWMADeny Authority { get; private set; }
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
FieldAuthority item = (FieldAuthority)obj;
return (FieldDef.ID == item.FieldDef.ID);
}
public override int GetHashCode() { return (int)FieldDef.ID; }
public FieldAuthority(FieldDef fieldDef, enumAuthRORWMADeny authority)
{ FieldDef = fieldDef; Authority = authority; }
}