/// <summary>
 /// Gets the KPI scorecard items of the given type.
 /// </summary>
 /// <param name="db">The DB context.</param>
 /// <param name="itemType">Type of the KPI scorecard.</param>
 /// <returns>The KPI scorecard items of the given type.</returns>
 /// <remarks>All exceptions will be propagated.</remarks>
 private static IList <KPIScorecardItem> GetKPIScorecardItems(DbContext db, KPIScorecardItemType itemType)
 {
     return(db.Set <KPIScorecardItem>()
            .Include(x => x.ServiceLevel)
            .Include(x => x.Threshold)
            .Where(x => x.Type == itemType).ToList());
 }
        /// <summary>
        /// Updates the scorecard item entities.
        /// </summary>
        /// <param name="db">The DB context.</param>
        /// <param name="updatedItems">The updated items.</param>
        /// <param name="itemType">Type of the scorecard item.</param>
        /// <remarks>All exceptions will be propagated.</remarks>
        private static void UpdateScorecardItemEntities(CustomDbContext db,
                                                        IList <KPIScorecardItem> updatedItems, KPIScorecardItemType itemType)
        {
            if (updatedItems == null)
            {
                return;
            }

            DbSet <KPIScorecardItem> set           = db.Set <KPIScorecardItem>();
            IList <KPIScorecardItem> existingItems = set.Include(x => x.ServiceLevel).Include(x => x.Threshold)
                                                     .Where(x => x.Type == itemType).ToList();

            foreach (KPIScorecardItem item in updatedItems)
            {
                item.Type = itemType;

                KPIScorecardItem existing = existingItems.FirstOrDefault(x => x.Id == item.Id);
                if (existing == null)
                {
                    // add new entity
                    set.Add(item);
                }
                else
                {
                    // update existing
                    db.Entry(existing).CurrentValues.SetValues(item);
                    existing.ServiceLevel.CopyValuesFrom(item.ServiceLevel);
                    existing.Threshold.CopyValuesFrom(item.Threshold);
                }
            }

            DeleteMissingEntities(set, existingItems, updatedItems);
        }