public ShardMap GetShardMap(int shardMapID)
        {
            ShardMap map = null;

            using (var context = GetConnection(ConnectionString))
            {
                var dbShardMap = context.ShardMaps.FirstOrDefault(x => x.ShardMapID == shardMapID);
                if (dbShardMap != null)
                {
                    map = new ShardMap
                    {
                        ShardMapID = dbShardMap.ShardMapID,
                        Shards     = dbShardMap.RangeShards.Select(x => new RangeShard
                        {
                            ServerInstanceName  = x.Database.Server.ServerName,
                            Catalog             = x.Database.DatabaseName,
                            HighDistributionKey = x.RangeHighValue,
                            LowDistributionKey  = x.RangeLowValue,
                            ShardID             = x.ShardID
                        }).ToList()
                    };
                }
            }
            return(map);
        }
 public ShardSetConfig()
 {
     ShardSetID             = -1;
     ShardSetConfigID       = -1;
     Version                = -1;
     ShardMap               = new ShardMap();
     Servers                = new List <Server>();
     Shards                 = new List <Shard>();
     ShardSetConfigSettings = new List <ShardSetConfigSetting>();
 }
        public ShardMap AddShardMap(ShardMap shardMap)
        {
            ShardMap savedShardMap;

            using (var context = GetConnection(ConnectionString))
            {
                using (var scope = new TransactionScope())
                {
                    savedShardMap = AddShardMap(shardMap, context);
                    scope.Complete();
                }
            }
            return(savedShardMap);
        }
        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);
        }