public CardModel <Group> Save([FromBody] CardModel <Group> card) { if (card?.Member == null) { throw new ArgumentNullException(nameof(card)); } using (var transaction = _repository.BeginTransaction()) { if (card.Member.Id > 0) { _repository.Update(card.Member); } else { card.Member.OrganizationId = _sessionContext.OrganizationId; card.Member.CreateDate = DateTime.Now; _repository.Insert(card.Member); } var dbRoles = _memberRepository.Roles(card.Member.Id, false); var rolesAdd = card.Roles.Diff(dbRoles); var rolesDel = dbRoles.Diff(card.Roles); var dbGroups = _memberRepository.Groups(card.Member.Id, MemberRelationType.Direct); var groupsAdd = card.Groups.Diff(dbGroups); var groupsDel = dbGroups.Diff(card.Groups); _memberRepository.InsertRoles(card.Member.Id, rolesAdd); _memberRepository.DeleteRoles(card.Member.Id, rolesDel); _memberRepository.InsertGroups(card.Member.Id, groupsAdd); _memberRepository.DeleteGroups(card.Member.Id, groupsDel); transaction.Commit(); } return(card); }