public Summary RemoveSummary(Summary summary, User user, DbConcurencyUpdateOptions concurencyUpdateOption) { AuthenticateUser(user); bool canReadSummary = false; foreach (var g in user.UserGroups) { if (g.CanReadAccountablesSummary) { canReadSummary = true; } } if (!canReadSummary) { throw new FaultException <AuthenticateFaultException>(new AuthenticateFaultException(user)); } if (summary.CheckPeriodIsUnlocked() == false) { throw new FaultException <PeriodIsLockedException>(new PeriodIsLockedException(summary.SummaryDate)); } if (concurencyUpdateOption == DbConcurencyUpdateOptions.DatabasePriority) { throw new FaultException <InvalidOperationException>(new InvalidOperationException("Работа опрации в режиме DbConcurencyUpdateOptions.DatabasePriority не имеет смысла.")); } Summary result = null; using (CFAPContext ctx = new CFAPContext()) { if (summary.UserLastChanged == null || summary.UserLastChanged.Id != user.Id) { summary.UserLastChanged = user; } summary.SetRelationships(ctx); //Когда сущность проходит через SaveChanges все ассоциации обнуляються. Так как с базы данных после удаления обькт получить невозможно - единственный способ сохранить его состояние через клонирование. result = (Summary)summary.Clone(); try { ctx.Summaries.Attach(summary); var summaryDbVersion = (Summary)ctx.Entry(summary).GetDatabaseValues().ToObject(); if (summaryDbVersion.ReadOnly) { throw new ReadOnlyException(); } ctx.Entry(summary).State = EntityState.Deleted; ctx.SaveChanges(concurencyUpdateOption); //Ссылочные свойства (связи в БД) больше не отслеживаютсья контекстом и подлежать востановлению только вручную, через явное указание Id и поиск в БД сущности связи по идентификатору. } catch (ReadOnlyException) { throw new FaultException <TryChangeReadOnlyFiledException>(new TryChangeReadOnlyFiledException(typeof(Summary), summary.Id, null, user)); } catch (DbUpdateConcurrencyException ex) { Summary dbSummary = (Summary)ex.Entries.Single().GetDatabaseValues().ToObject(); Summary currentSummary = result; //Метод Load не загрузит ссылочные свойства без конкретного указания Id. //Свойство коллекции UserGroups является связью многие-ко-многим. Экземпляр сущности не содержит ключи этих связей в виде элементарных типов данных. //dbSummary.UserGroups = result.UserGroups; dbSummary = LoadRelationshipsDbSummary(dbSummary); ConcurrencyException <Summary> concurrencyException = new ConcurrencyException <Summary>(dbSummary, currentSummary); throw new FaultException <ConcurrencyException <Summary> >(concurrencyException); } catch (NullReferenceException ex) { throw new FaultException <FiledDeletedException>(new FiledDeletedException(ex)); } catch (Exception ex) { throw new FaultException <DbException>(new DbException(ex)); } } return(result); }