public List<Ethnicity> GetEthnicities()
 {
     using (context = new DomainContext())
     {
         return context.Ethnicities.ToList();
     }
 }
 public List<TimeZone> GetTimeZones()
 {
     using (context = new DomainContext())
     {
         return context.TimeZones.ToList();
     }
 }
 public List<EnumeratorTranslation> GetEnumeratorTranslations()
 {
     using (context = new DomainContext())
     {
         return context.EnumeratorTranslations.ToList();
     }
 }
 public List<Race> GetRaces()
 {
     using (context = new DomainContext())
     {
         return context.Races.ToList();
     }
 }
        public Member AddMember(Member member)
        {
            using (context = new DomainContext())
            {
                context.Members.Add(member);
                context.SaveChanges();
            }

            return member;
        }
        public MemberToken CreateToken(MemberToken memberToken)
        {
            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                context.MemberTokens.Add(memberToken);

                context.SaveChanges();
            }

            return memberToken;
        }
        public MemberSetting CreateMemberSetting(MemberSetting memberSetting)
        {
            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                context.MemberSettings.Add(memberSetting);

                context.SaveChanges();
            }

            return memberSetting;
        }
        public MemberEmailChange CreateEmailChange(MemberEmailChange memberEmailChange)
        {
            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                context.MemberEmailChanges.Add(memberEmailChange);

                context.SaveChanges();
            }

            return memberEmailChange;
        }
        public Member ConfirmRegistration(Member member)
        {
            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";
                var tokenVariable = "@token";
                var membershipDateVariable = "@membershipDate";

                var command = string.Format("exec ConfirmRegistration {0}, {1}, {2}",
                                            memberIdVariable,
                                            tokenVariable,
                                            membershipDateVariable);

                var memberId = new SqlParameter(memberIdVariable, member.Id);
                var token = new SqlParameter(tokenVariable, member.Tokens.ElementAt(0).Token);
                var membershipDate = new SqlParameter(membershipDateVariable, member.MembershipDate);

                context.Database.ExecuteSqlCommand(command, memberId, token, membershipDate);
            }

            return member;
        }
        public Member GetMember(string email)
        {
            Member member = null;

            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                var result = context.Members
                                    .Include("Security")
                                    .Include("Profile")
                                    .Where(m => string.Compare(m.Email, email, true) == 0)
                                    .FirstOrDefault();

                if (result == null)
                {
                    member = new Member();
                    member.Security = new MemberPassword();
                }
                else
                {
                    member = result;
                }
            }

            return member;
        }
        public MemberToken UpdateToken(MemberToken memberToken)
        {
            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                context.MemberTokens.Attach(memberToken);
                context.Entry<MemberToken>(memberToken).State = EntityState.Modified;

                context.SaveChanges();
            }

            return memberToken;
        }
        public MemberProfile UpdateProfile(MemberProfile memberProfile)
        {
            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";
                var timeZoneIdVariable = "@timeZoneId";
                var aliasVariable = "@alias";
                var genderVariable = "@gender";
                var birthDateVariable = "@birthDate";

                var command = string.Format("exec UpdateProfile {0}, {1}, {2}, {3}, {4}",
                                            memberIdVariable,
                                            timeZoneIdVariable,
                                            aliasVariable,
                                            genderVariable,
                                            birthDateVariable);

                var memberId = new SqlParameter(memberIdVariable, memberProfile.MemberId);
                var timeZondeId = new SqlParameter(timeZoneIdVariable, memberProfile.TimeZoneId);
                var alias = new SqlParameter(aliasVariable, memberProfile.Alias);
                var gender = new SqlParameter(genderVariable, memberProfile.Gender);
                var birthDate = new SqlParameter(birthDateVariable, memberProfile.BirthDate);

                context.Database.ExecuteSqlCommand(command, memberId, timeZondeId, alias, gender, birthDate);
            }

            return memberProfile;
        }
        public MemberEmailChange GetMemberEmailChange(int memberId)
        {
            MemberEmailChange memberEmailChange;

            using (context = new DomainContext())
            {
                var entity = context.MemberEmailChanges.SingleOrDefault(i => i.MemberId == memberId);

                if (entity == null)
                {
                    memberEmailChange = new MemberEmailChange();
                }
                else
                {
                    memberEmailChange = entity;
                }
            }

            return memberEmailChange;
        }
        public MemberEmailChange UpdateEmailChange(MemberEmailChange memberEmailChange)
        {
            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";
                var emailVariable = "@email";

                var command = string.Format("exec UpdateEmailChange {0}, {1}",
                                            memberIdVariable,
                                            emailVariable);

                var memberId = new SqlParameter(memberIdVariable, memberEmailChange.MemberId);
                var email = new SqlParameter(emailVariable, memberEmailChange.Email);

                context.Database.ExecuteSqlCommand(command, memberId, email);
            }

            return memberEmailChange;
        }
        public Member ReRegisterMember(Member member)
        {
            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";
                var aliasVariable = "@alias";
                var saltValueVariable = "@saltValue";
                var passwordVariable = "@password";

                var command = string.Format("exec ReRegisterMember {0}, {1}, {2}, {3}",
                                            memberIdVariable,
                                            aliasVariable,
                                            saltValueVariable,
                                            passwordVariable);

                var memberId = new SqlParameter(memberIdVariable, member.Id);
                var alias = new SqlParameter(aliasVariable, member.Profile.Alias);
                var saltValue = new SqlParameter(saltValueVariable, member.Security.SaltValue);
                var password = new SqlParameter(passwordVariable, member.Security.Password);

                context.Database.ExecuteSqlCommand(command, memberId, alias, saltValue, password);
            }

            return member;
        }
        public List<MemberToken> GetMemberTokens(int id, TokenTypes tokenType, bool excludeConfirmed)
        {
            List<MemberToken> memberTokens = null;

            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                var result = context.MemberTokens
                                    .Where(mt => mt.MemberId == id && mt.TokenType == tokenType &&
                                          (!excludeConfirmed || !mt.ConfirmedDate.HasValue))
                                    .ToList();

                if (result == null)
                {
                    memberTokens = new List<MemberToken>();
                }
                else
                {
                    memberTokens = result;
                }
            }

            return memberTokens;
        }
        public List<MemberSettingResult> GetMemberSettings(int id)
        {
            var returnList = new List<MemberSettingResult>();

            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";

                var command = string.Format("SelectMemberSettings {0}", memberIdVariable);

                var memberId = new SqlParameter(memberIdVariable, id);

                var result = context.Database.SqlQuery<MemberSettingResult>(command, memberId).ToList();

                if (result.Any())
                {
                    returnList.AddRange(result);
                }
            }

            return returnList;
        }
        public MemberSetting GetMemberSetting(int memberId, SettingTypes settingTypeId)
        {
            MemberSetting memberSetting = new MemberSetting();

            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                var result = context.MemberSettings.SingleOrDefault(ms => ms.MemberId == memberId && ms.SettingTypeId == settingTypeId);

                if (result != null)
                {
                    memberSetting.MemberId = result.MemberId;
                    memberSetting.SettingTypeId = result.SettingTypeId;
                    memberSetting.Value = result.Value;
                }
            }

            return memberSetting;
        }
        public MemberSetting UpdateMemberSetting(MemberSetting memberSetting)
        {
            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                context.MemberSettings.Attach(memberSetting);

                context.Entry<MemberSetting>(memberSetting).State = EntityState.Modified;

                context.SaveChanges();
            }

            return memberSetting;
        }
        public Member GetMember(Guid token)
        {
            Member member = null;

            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                var result = context.MemberTokens
                                    .Include("Member")
                                    .Include("Profile")
                                    .Where(mt => mt.Token == token)
                                    .FirstOrDefault();

                if (result == null)
                {
                    member = new Member();
                }
                else
                {
                    member = result.Member;
                }
            }

            return member;
        }
        public MemberPassword UpdatePassword(MemberPassword memberPassword)
        {
            using (context = new DomainContext())
            {
                var memberIdVariable = "@memberId";
                var saltValueVariable = "@saltValue";
                var passwordVariable = "@password";

                var command = string.Format("exec UpdatePassword {0}, {1}, {2}",
                                            memberIdVariable,
                                            saltValueVariable,
                                            passwordVariable);

                var memberId = new SqlParameter(memberIdVariable, memberPassword.MemberId);
                var saltValue = new SqlParameter(saltValueVariable, memberPassword.SaltValue);
                var password = new SqlParameter(passwordVariable, memberPassword.Password);

                context.Database.ExecuteSqlCommand(command, memberId, saltValue, password);
            }

            return memberPassword;
        }
        public Member GetMember(int id)
        {
            Member member = null;

            using (context = new DomainContext())
            {
                context.Configuration.LazyLoadingEnabled = false;

                var result = context.Members
                                    .Include("Security")
                                    .Include("Profile")
                                    .Where(m => m.Id == id)
                                    .FirstOrDefault();

                if (result == null)
                {
                    member = new Member();
                }
                else
                {
                    member = result;
                }
            }

            return member;
        }