public void ChangeAchievement(Account account, Achievement achievement)
        {
            if (account == null)
                throw new ArgumentNullException("account");

            if (achievement == null)
                throw new ArgumentNullException("achievement");

            if (achievement.Year.Year < DateTime.Now.Year)
            {
                // throw custermized exception
                throw new AchievementException(Resource.ResourceMessage.ex_AchievementYearLessThanCurrentYear);
                return;
            }

            var achievements = account.Achievements.ToList<Achievement>();

            if (achievements != null && achievements.Count > 0)
            {
                var accountAchievement = account.Achievements.Single<Achievement>(a =>
                {
                    if (a.Year == achievement.Year && a.AccountId == achievement.AccountId)
                        return true;
                    return false;
                });

                if (accountAchievement != null)
                {
                    achievement.Id = accountAchievement.Id;
                    accountAchievement = Mapper.Map<Achievement>(achievement);
                }
            }
            else
            {
                var accountAchievement = Mapper.Map<Achievement>(achievement);
                accountAchievement.Id = Guid.NewGuid();
                account.Achievements.Add(accountAchievement);
            }

            var history = new AchievementHistory(achievement);
            account.AchievementHistories.Add(history);
            if (account.AchievementHistories.Count<AchievementHistory>(ah => ah.Year == achievement.Year) > 3)
                account.LockAccount();
        }
        public void ChangeAchievement(AccountDTO account_dto)
        {
            if (account_dto == null)
                throw new ArgumentNullException("account_dto");

            var account = Mapper.Map<Account>(account_dto);
            var achievement = new Achievement(account);

            if (achievement.Year.Year < DateTime.Now.Year)
            {
                // TODO: throw custermized exception
                return;
            }

            IUnityContainer container = new UnityContainer();

            IRepository<Account> accountRepository = container.Resolve<IRepository<Account>>();
            if (accountRepository.Get(achievement.AccountId) != null)
            {
                using (TransactionScope scope = new TransactionScope())
                {

                    IRepository<Achievement> achievementRepository = container.Resolve<IRepository<Achievement>>();
                    achievementRepository.TrackEntity(achievement);
                    achievementRepository.Commit();

                    var history = new AchievementHistory(achievement);
                    IRepository<AchievementHistory> archievementHistoryRepository = container.Resolve<IRepository<AchievementHistory>>();
                    archievementHistoryRepository.Add(history);
                    archievementHistoryRepository.Commit();

                    var changeTimes = archievementHistoryRepository.GetFiltered(a => a.AccountId == achievement.Id).Count<AchievementHistory>();
                    if (changeTimes > 2)
                    {
                        var accountLock = Mapper.Map<Account>(account_dto);
                        accountRepository.TrackEntity(accountLock);
                        accountLock.LockAccount();
                        accountRepository.Commit();
                    }

                    scope.Complete();
                }
            }
        }
 /// <summary>
 /// Deprecated Method for adding a new object to the AchievementHistories EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddToAchievementHistories(AchievementHistory achievementHistory)
 {
     base.AddObject("AchievementHistories", achievementHistory);
 }