public void Delete(ArchivedStatus archivedStatus) { if (archivedStatus == null) { throw new ArgumentNullException("archivedStatus"); } Context.ArchivedStatuses.Remove(archivedStatus); }
public void Add(ArchivedStatus archivedStatus) { if (archivedStatus == null) { throw new ArgumentNullException("archivedStatus"); } Context.ArchivedStatuses.Add(archivedStatus); }
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); }