protected override FascicleDocumentUnit BeforeCreate(FascicleDocumentUnit entity)
        {
            short?idCategory = null;

            if (entity.Fascicle != null)
            {
                entity.Fascicle = _unitOfWork.Repository <Fascicle>().GetByUniqueId(entity.Fascicle.UniqueId, optimization: false);
                idCategory      = entity.Fascicle.Category.EntityShortId;
            }

            if (entity.FascicleFolder != null)
            {
                entity.FascicleFolder = _unitOfWork.Repository <FascicleFolder>().Find(entity.FascicleFolder.UniqueId);
            }

            if (entity.FascicleFolder == null && idCategory.HasValue)
            {
                entity.FascicleFolder = _unitOfWork.Repository <FascicleFolder>().GetByCategoryAndFascicle(entity.Fascicle.UniqueId, idCategory.Value, optimization: false).FirstOrDefault();
            }

            if (entity.DocumentUnit != null)
            {
                entity.DocumentUnit = _unitOfWork.Repository <DocumentUnit>().GetByIdWithCategory(entity.DocumentUnit.UniqueId).SingleOrDefault();
            }

            entity.ReferenceType = ReferenceType.Reference;
            if (entity.Fascicle.FascicleType != FascicleType.Activity)
            {
                entity = AutomaticFascicleDetection(entity);
            }

            entity.Fascicle.LastChangedDate = DateTimeOffset.UtcNow;
            FascicleLog fascicleLog = FascicleService.CreateLog(entity.Fascicle, entity.ReferenceType.Equals(ReferenceType.Fascicle) ? FascicleLogType.UDInsert : FascicleLogType.UDReferenceInsert,
                                                                string.Format("Inserimento ({0}) {1} n. {2} in fascicolo n. {3}",
                                                                              entity.ReferenceType.Equals(ReferenceType.Fascicle) ? EnumHelper.GetDescription(ReferenceType.Fascicle) : EnumHelper.GetDescription(ReferenceType.Reference),
                                                                              LogDocumentNameHelper.GetAttributeDescription(GetType()),
                                                                              entity.UniqueId,
                                                                              entity.Fascicle == null ? string.Empty : entity.Fascicle.Title), CurrentDomainUser.Account);

            _unitOfWork.Repository <FascicleLog>().Insert(fascicleLog);
            PrepareDocumentUnitLog(entity, fascicleLog);

            if (entity.Fascicle != null)
            {
                ReferenceType          referenceType = (entity.ReferenceType == ReferenceType.Fascicle) ? ReferenceType.Reference : ReferenceType.Fascicle;
                IEnumerable <Fascicle> fascicles     = AssociatedFascicles(entity.DocumentUnit, referenceType);

                if (fascicles.Any())
                {
                    IEnumerable <Fascicle> fascicleToLinks = fascicles.Where(f => (!f.FascicleLinks.Any() || !f.FascicleLinks.Any(fl => fl.FascicleLinked.UniqueId == entity.Fascicle.UniqueId)));

                    ICollection <FascicleLink> fascicleLinks = new HashSet <FascicleLink>();
                    foreach (Fascicle item in fascicleToLinks)
                    {
                        fascicleLinks.Add(new FascicleLink()
                        {
                            Fascicle         = item,
                            FascicleLinked   = entity.Fascicle,
                            FascicleLinkType = FascicleLinkType.Automatic
                        });

                        fascicleLinks.Add(new FascicleLink()
                        {
                            Fascicle         = entity.Fascicle,
                            FascicleLinked   = item,
                            FascicleLinkType = FascicleLinkType.Automatic
                        });
                    }
                    _unitOfWork.Repository <FascicleLink>().InsertRange(fascicleLinks);
                }
            }
            return(base.BeforeCreate(entity));
        }
        protected override FascicleDocumentUnit BeforeDelete(FascicleDocumentUnit entity, FascicleDocumentUnit entityTransformed)
        {
            if (entityTransformed == null)
            {
                entityTransformed = GetByFascicle(entity.DocumentUnit, entity.Fascicle.UniqueId).FirstOrDefault();
                if (entityTransformed == null)
                {
                    throw new DSWException(DOCUMENT_UNIT_NOT_FOUND_MESSAGE, null, DSWExceptionCode.DB_Anomaly);
                }
            }

            if (entity.Fascicle != null)
            {
                entityTransformed.Fascicle = _unitOfWork.Repository <Fascicle>().Find(entity.Fascicle.UniqueId);
            }

            if (entity.DocumentUnit != null)
            {
                entityTransformed.DocumentUnit = _unitOfWork.Repository <DocumentUnit>().Find(entity.DocumentUnit.UniqueId);
            }

            entity.ReferenceType = entityTransformed.ReferenceType;

            _unitOfWork.Repository <FascicleLog>().Insert(FascicleService.CreateLog(entityTransformed.Fascicle, FascicleLogType.UDDelete,
                                                                                    $"Eliminazione {LogDocumentNameHelper.GetAttributeDescription(GetType())} n. { entityTransformed.DocumentUnit.GetTitle()} da fascicolo n. {entityTransformed.Fascicle.Title}",
                                                                                    CurrentDomainUser.Account));

            return(base.BeforeDelete(entity, entityTransformed));
        }