public BlockingConstraintModel(BlockingConstraint constraint)
        {
            Id           = constraint.Id;
            Index        = constraint.Index;
            Negated      = constraint.Negated;
            SelectedMode = constraint.Mode;
            Description  = constraint.Description;

            AllUsers = constraint.AllUsers;
            ForEver  = constraint.ForEver;

            ForTimeInterval = new TimeInterval();

            if (constraint.ForPeriodicTimeInterval != null)
            {
                if (constraint.ForPeriodicTimeInterval.Id != 0)
                {
                    ForPeriodicTimeInterval       = new PeriodicTimeIntervalModel(constraint.ForPeriodicTimeInterval, (DateTime)constraint.ForTimeInterval.StartTime.Instant, constraint.ForTimeInterval.EndTime.Instant);
                    ForPeriodicTimeInterval.IsSet = true;
                    ForPeriodicTimeInterval.Index = constraint.Index;
                }
                else
                {
                    ForPeriodicTimeInterval = new PeriodicTimeIntervalModel();
                }
            }

            if (constraint.ForPerson != null)
            {
                if (constraint.ForPerson.Self is PersonGroup)
                {
                    PersonGroup pGroup = (PersonGroup)constraint.ForPerson.Self;
                    // pGroup.Users.ToList().ForEach(u => ForPersons.Add(new PersonInConstraint(u, pGroup.Id, constraint.Index)));
                }
                else if (constraint.ForPerson.Self is IndividualPerson)
                {
                    IndividualPerson iPerson = (IndividualPerson)constraint.ForPerson.Self;
                    ForPersons.Add(new PersonInConstraint(iPerson.Person, iPerson.Id, constraint.Index));
                }
            }

            if (constraint.ForTimeInterval != null)
            {
                TimeInterval timeInterval = new TimeInterval();
                timeInterval           = constraint.ForTimeInterval.Self;
                timeInterval.StartTime = constraint.ForTimeInterval.StartTime.Self;
                timeInterval.EndTime   = constraint.ForTimeInterval.EndTime.Self;
                ForTimeInterval        = timeInterval;
            }
            else
            {
                ForTimeInterval = new TimeInterval();
            }
        }
        public BlockingConstraint SaveConstraint(BlockingConstraint constraint)
        {
            //if (timePeriod != null)
            //    constraint.TimePeriod = timePeriod;

            using (IUnitOfWork uow = this.GetUnitOfWork())
            {
                IRepository <BlockingConstraint> repo = uow.GetRepository <BlockingConstraint>();
                repo.Put(constraint);
                uow.Commit();
            }
            return(constraint);
        }
        public bool DeleteConstraint(BlockingConstraint constraint)
        {
            Contract.Requires(constraint != null);
            Contract.Requires(constraint.Id >= 0);

            using (IUnitOfWork uow = this.GetUnitOfWork())
            {
                IRepository <BlockingConstraint> repo = uow.GetRepository <BlockingConstraint>();
                constraint = repo.Reload(constraint);
                repo.Delete(constraint);
                uow.Commit();
            }
            return(true);
        }
        public BlockingConstraint UpdateConstraint(BlockingConstraint constraint)
        {
            Contract.Requires(constraint != null, "provided entity can not be null");
            Contract.Requires(constraint.Id >= 0, "provided entity must have a permanent ID");

            Contract.Ensures(Contract.Result <BlockingConstraint>() != null && Contract.Result <BlockingConstraint>().Id >= 0, "No entity is persisted!");

            using (IUnitOfWork uow = this.GetUnitOfWork())
            {
                IRepository <BlockingConstraint> repo = uow.GetRepository <BlockingConstraint>();
                repo.Merge(constraint);
                var merged = repo.Get(constraint.Id);
                repo.Put(merged);
                uow.Commit();
            }
            return(constraint);
        }