예제 #1
0
 public void Delete(ArchivedStatus archivedStatus)
 {
     if (archivedStatus == null)
     {
         throw new ArgumentNullException("archivedStatus");
     }
     Context.ArchivedStatuses.Remove(archivedStatus);
 }
예제 #2
0
 public void Add(ArchivedStatus archivedStatus)
 {
     if (archivedStatus == null)
     {
         throw new ArgumentNullException("archivedStatus");
     }
     Context.ArchivedStatuses.Add(archivedStatus);
 }
예제 #3
0
        protected IEventCacheReadObject AddStatusEvent(Guid accountId, BulbCacheWriteObject data, Guid ownerId)
        {
            var accountDbContext = Context.GetAccountDbContext(accountId);
            var eventType        = SystemEventType.GetStatusEventType(data.EventCategory);
            var now = DateTime.Now;

            // создаем новый статус
            var newStatus = new Event()
            {
                Id                 = Guid.NewGuid(),
                Message            = data.Message,
                ActualDate         = data.ActualDate,
                Category           = data.EventCategory,
                Count              = data.Count,
                CreateDate         = now,
                LastUpdateDate     = now,
                EndDate            = data.EndDate,
                Importance         = EventImportanceHelper.Get(data.Status),
                OwnerId            = ownerId,
                StartDate          = data.StartDate,
                EventTypeId        = eventType.Id,
                PreviousImportance = EventImportanceHelper.Get(data.PreviousStatus),
                IsSpace            = data.IsSpace
            };

            if (data.FirstEventId.HasValue && data.FirstEventId != Guid.Empty)
            {
                newStatus.FirstReasonEventId = data.FirstEventId;
            }
            var eventRepository = accountDbContext.GetEventRepository();

            eventRepository.Add(newStatus);

            // обновим старый статус
            var oldStatus = eventRepository.GetByIdOrNull(data.StatusEventId);

            if (oldStatus != null)
            {
                // установим флажок, если это архивный статус
                if (oldStatus.Category == EventCategory.ComponentExternalStatus)
                {
                    var archivedStatus = new ArchivedStatus()
                    {
                        EventId = oldStatus.Id
                    };
                    var archivedStatusRepository = accountDbContext.GetArchivedStatusRepository();
                    archivedStatusRepository.Add(archivedStatus);
                }

                // старый статус завершается, когда начинается новый статус
                oldStatus.ActualDate     = newStatus.StartDate;
                oldStatus.EndDate        = newStatus.StartDate;
                oldStatus.LastUpdateDate = now;

                // убедимся, что очереди изменений нет изменений старого статуста,
                // иначе наши изменения через EF могут быть перезатёрты
                using (var oldStatusCache = AllCaches.Events.GetForWrite(oldStatus, accountId))
                {
                    oldStatusCache.WaitSaveChanges();
                    oldStatusCache.Unload();
                }
            }

            // обновим лампочку через EF, чтобы {лампочка, старый статус и новый статус} сохранились одновременно
            // изменения лампочки будут сохранены дважды, воторой раз в очереди изменений
            // сейчас не понятно как этого избежать, дело в том, что после данного метода код может изменить кэш лампочки
            // и чтобы не потерять эти изменения сохраняем дважды
            data.StatusEventId = newStatus.Id;
            var bulbEF = accountDbContext.GetStatusDataRepository().GetById(data.Id);

            bulbEF.Count           = data.Count;
            bulbEF.ActualDate      = data.ActualDate;
            bulbEF.EndDate         = data.EndDate;
            bulbEF.FirstEventId    = data.FirstEventId;
            bulbEF.HasSignal       = data.HasSignal;
            bulbEF.LastEventId     = data.LastEventId;
            bulbEF.Message         = data.Message;
            bulbEF.PreviousStatus  = data.PreviousStatus;
            bulbEF.StartDate       = data.StartDate;
            bulbEF.Status          = data.Status;
            bulbEF.StatusEventId   = data.StatusEventId;
            bulbEF.LastChildBulbId = data.LastChildBulbId;

            // убедимся что в очереди изменений нет других изменений лампочки,
            // иначе сохранённые через EF изменения могут быть потеряны
            data.WaitSaveChanges();

            // todo нужно сохранять изменения в одном контексте (транзакции),
            // чтобы лампочка не потеряла ссылку на последний статус
            accountDbContext.SaveChanges();

            var rEvent = AllCaches.Events.Find(new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = newStatus.Id
            });

            return(rEvent);
        }