private void AddPointerShards(DataElasticityEntities context, ShardSetConfig shardSetConfig)
        {
            foreach (var ps in shardSetConfig.Shards)
            {
                if (ps.PointerShardID == -1)
                {
                    AddShardToShardSet(ps, shardSetConfig);
                }
                else
                {
                    ModifyShard(ps);
                }
            }

            var deleteShards =
                context.Shards.Where(p => p.ShardSetID == shardSetConfig.ShardSetID);

            foreach (var ps in deleteShards)
            {
                if (shardSetConfig.Shards.Count(x => x.PointerShardID == ps.ShardID) == 0)
                {
                    context.Shards.Remove(ps);
                }
            }
        }
        private ShardMap AddShardMap(ShardMap shardMap, DataElasticityEntities context)
        {
            if (shardMap.ShardMapID != -1)
            {
                throw new ArgumentException("Shard Map must be new");
            }
            if (shardMap.Shards.Any(x => x.ShardID != -1))
            {
                throw new ArgumentException("All shards in map must be new");
            }

            var dbShardMap = new Models.ShardMap();

            context.ShardMaps.Add(dbShardMap);
            context.SaveChanges();
            shardMap.ShardMapID = dbShardMap.ShardMapID;
            foreach (var shard in shardMap.Shards)
            {
                var dbShard = new Models.RangeShard
                {
                    Database =
                        context.Databases
                        .FirstOrDefault(
                            d => d.DatabaseName == shard.Catalog && d.Server.ServerName == shard.ServerInstanceName),
                    RangeHighValue = shard.HighDistributionKey,
                    RangeLowValue  = shard.LowDistributionKey,
                    ShardMap       = dbShardMap,
                };

                if (dbShard.Database == null)
                {
                    dbShard.Database = new Database
                    {
                        DatabaseName = shard.Catalog,
                        Server       = context.Servers.FirstOrDefault(s => s.ServerName == shard.ServerInstanceName),
                    };

                    context.Databases.Add(dbShard.Database);
                }

                context.RangeShards.Add(dbShard);
                context.SaveChanges();

                shard.ShardID = dbShard.ShardID;
            }
            return(shardMap);
        }