public IList<Loadtest> ConvertToDomain(IEnumerable<LoadtestViewModel> viewModels)
        {
            List<Loadtest> loadtests = new List<Loadtest>();
            LoadTestingContext context = LoadTestingContext.Create(base.ConnectionStringRepository);
            foreach (LoadtestViewModel vm in viewModels)
            {
                Guid id = vm.Id;
                LoadtestParameters ltParams = new LoadtestParameters(vm.StartDateUtc, vm.UserCount, vm.DurationSec);

                var agentQueryBuilder = Builders<AgentMongoDb>.Filter;
                var agentCityFilter = agentQueryBuilder.Eq<string>(a => a.Location.City.ToLower(), vm.AgentCity.ToLower());
                var agentCountryFilter = agentQueryBuilder.Eq<string>(a => a.Location.Country.ToLower(), vm.AgentCountry.ToLower());
                var agentCompleteFilter = agentQueryBuilder.And(agentCityFilter, agentCountryFilter);
                AgentMongoDb agentDb = context.Agents.Find(agentCompleteFilter).FirstOrDefault();
                if (agentDb == null) throw new ArgumentException("There is no agent with the given properties.");

                var customerQueryBuilder = Builders<CustomerMongoDb>.Filter;
                var customerQuery = customerQueryBuilder.Eq<string>(c => c.Name.ToLower(), vm.CustomerName.ToLower());
                CustomerMongoDb custDb = context.Customers.Find(customerQuery).SingleOrDefault();
                if (custDb == null) throw new ArgumentException("There is no customer with the given properties.");

                Guid? engineerId = null;
                if (!string.IsNullOrEmpty(vm.EngineerName))
                {
                    EngineerMongoDb engDb = context.Engineers.Find(e => e.Name.ToLower() == vm.EngineerName.ToLower()).SingleOrDefault();
                    if (engDb == null) throw new ArgumentException("There is no engineer with the given properties.");
                    engineerId = engDb.DomainId;
                }

                LoadtestTypeMongoDb ltTypeDb = context.LoadtestTypes.Find(t => t.Description.ShortDescription.ToLower() == vm.LoadtestTypeShortDescription.ToLower()).SingleOrDefault();
                if (ltTypeDb == null) throw new ArgumentException("There is no load test type with the given properties.");

                ProjectMongoDb projectDb = context.Projects.Find(p => p.Description.ShortDescription.ToLower() == vm.ProjectName.ToLower()).SingleOrDefault();
                if (projectDb == null) throw new ArgumentException("There is no project with the given properties.");

                var scenarioQueryBuilder = Builders<ScenarioMongoDb>.Filter;
                var scenarioUriOneFilter = scenarioQueryBuilder.Eq<string>(s => s.UriOne.ToLower(), vm.ScenarioUriOne.ToLower());
                var scenarioUriTwoFilter = scenarioQueryBuilder.Eq<string>(s => s.UriTwo.ToLower(), vm.ScenarioUriTwo.ToLower());
                var scenarioUriThreeFilter = scenarioQueryBuilder.Eq<string>(s => s.UriThree.ToLower(), vm.ScenarioUriThree.ToLower());
                var scenarioCompleteFilter = scenarioQueryBuilder.And(scenarioUriOneFilter, scenarioUriTwoFilter, scenarioUriThreeFilter);
                ScenarioMongoDb scenarioDb = context.Scenarios.Find(scenarioCompleteFilter).SingleOrDefault();
                if (scenarioDb == null)
                {
                    scenarioDb = new ScenarioMongoDb()
                    {
                        DbObjectId = ObjectId.GenerateNewId(),
                        DomainId = Guid.NewGuid()
                    };
                    if (!string.IsNullOrEmpty(vm.ScenarioUriOne))
                    {
                        scenarioDb.UriOne = vm.ScenarioUriOne;
                    }
                    if (!string.IsNullOrEmpty(vm.ScenarioUriTwo))
                    {
                        scenarioDb.UriTwo = vm.ScenarioUriTwo;
                    }
                    if (!string.IsNullOrEmpty(vm.ScenarioUriThree))
                    {
                        scenarioDb.UriThree = vm.ScenarioUriThree;
                    }
                    context.Scenarios.InsertOne(scenarioDb);
                }

                Loadtest converted = new Loadtest(id, ltParams, agentDb.DomainId, custDb.DomainId, engineerId, ltTypeDb.DomainId, projectDb.DomainId, scenarioDb.DomainId);
                loadtests.Add(converted);
            }
            return loadtests;
        }
        private static void Seed()
        {
            LoadTestingContext context = LoadTestingContext.Create(new WebConfigConnectionStringRepository());
            List<AgentMongoDb> agents = new List<AgentMongoDb>();
            AgentMongoDb amazon = new AgentMongoDb();
            amazon.DomainId = Guid.NewGuid();
            amazon.DbObjectId = ObjectId.GenerateNewId();
            amazon.Location = new LocationMongoDb()
            {
                City = "Seattle",
                Country = "USA",
                DbObjectId = ObjectId.GenerateNewId()
            };
            AgentMongoDb rackspace = new AgentMongoDb();
            rackspace.DomainId = Guid.NewGuid();
            rackspace.DbObjectId = ObjectId.GenerateNewId();
            rackspace.Location = new LocationMongoDb()
            {
                City = "Frankfurt",
                Country = "Germany",
                DbObjectId = ObjectId.GenerateNewId()
            };
            AgentMongoDb azure = new AgentMongoDb();
            azure.DomainId = Guid.NewGuid();
            azure.DbObjectId = ObjectId.GenerateNewId();
            azure.Location = new LocationMongoDb()
            {
                City = "Tokyo",
                Country = "Japan",
                DbObjectId = ObjectId.GenerateNewId()
            };
            agents.Add(amazon);
            agents.Add(rackspace);
            agents.Add(azure);
            Task addManyAgentsTask = context.Agents.InsertManyAsync(agents);

            List<CustomerMongoDb> customers = new List<CustomerMongoDb>();
            CustomerMongoDb niceCustomer = new CustomerMongoDb();
            niceCustomer.DomainId = Guid.NewGuid();
            niceCustomer.DbObjectId = ObjectId.GenerateNewId();
            niceCustomer.Name = "Nice customer";

            CustomerMongoDb greatCustomer = new CustomerMongoDb();
            greatCustomer.DomainId = Guid.NewGuid();
            greatCustomer.DbObjectId = ObjectId.GenerateNewId();
            greatCustomer.Name = "Great customer";

            CustomerMongoDb okCustomer = new CustomerMongoDb();
            okCustomer.DomainId = Guid.NewGuid();
            okCustomer.DbObjectId = ObjectId.GenerateNewId();
            okCustomer.Name = "OK Customer";

            customers.Add(niceCustomer);
            customers.Add(greatCustomer);
            customers.Add(okCustomer);
            Task addManyCustomersTask = context.Customers.InsertManyAsync(customers);

            List<EngineerMongoDb> engineers = new List<EngineerMongoDb>();
            EngineerMongoDb john = new EngineerMongoDb();
            john.DomainId = Guid.NewGuid();
            john.Name = "John";
            john.DbObjectId = ObjectId.GenerateNewId();

            EngineerMongoDb mary = new EngineerMongoDb();
            mary.DomainId = Guid.NewGuid();
            mary.Name = "Mary";
            mary.DbObjectId = ObjectId.GenerateNewId();

            EngineerMongoDb fred = new EngineerMongoDb();
            fred.DomainId = Guid.NewGuid();
            fred.Name = "Fred";
            fred.DbObjectId = ObjectId.GenerateNewId();

            engineers.Add(john);
            engineers.Add(mary);
            engineers.Add(fred);
            Task addManyEngineersTask = context.Engineers.InsertManyAsync(engineers);

            List<LoadtestTypeMongoDb> testTypes = new List<LoadtestTypeMongoDb>();
            LoadtestTypeMongoDb stressTest = new LoadtestTypeMongoDb();
            stressTest.DomainId = Guid.NewGuid();
            stressTest.DbObjectId = ObjectId.GenerateNewId();
            stressTest.Description = new DescriptionMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                ShortDescription = "Stress test",
                LongDescription = "To determine or validate an application’s behavior when it is pushed beyond normal or peak load conditions."
            };

            LoadtestTypeMongoDb capacityTest = new LoadtestTypeMongoDb();
            capacityTest.DomainId = Guid.NewGuid();
            capacityTest.DbObjectId = ObjectId.GenerateNewId();
            capacityTest.Description = new DescriptionMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                ShortDescription = "Capacity test",
                LongDescription = "To determine how many users and/or transactions a given system will support and still meet performance goals."
            };

            testTypes.Add(stressTest);
            testTypes.Add(capacityTest);
            Task addManyLoadtestTypesTask = context.LoadtestTypes.InsertManyAsync(testTypes);

            List<ProjectMongoDb> projects = new List<ProjectMongoDb>();
            ProjectMongoDb firstProject = new ProjectMongoDb();
            firstProject.DomainId = Guid.NewGuid();
            firstProject.DbObjectId = ObjectId.GenerateNewId();
            firstProject.Description = new DescriptionMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                ShortDescription = "First project",
                LongDescription = "Long description of first project"
            };

            ProjectMongoDb secondProject = new ProjectMongoDb();
            secondProject.DomainId = Guid.NewGuid();
            secondProject.DbObjectId = ObjectId.GenerateNewId();
            secondProject.Description = new DescriptionMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                ShortDescription = "Second project",
                LongDescription = "Long description of second project"
            };

            ProjectMongoDb thirdProject = new ProjectMongoDb();
            thirdProject.DomainId = Guid.NewGuid();
            thirdProject.DbObjectId = ObjectId.GenerateNewId();
            thirdProject.Description = new DescriptionMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                ShortDescription = "Third project",
                LongDescription = "Long description of third project"
            };
            projects.Add(firstProject);
            projects.Add(secondProject);
            projects.Add(thirdProject);
            Task addManyProjectsTask = context.Projects.InsertManyAsync(projects);

            List<ScenarioMongoDb> scenarios = new List<ScenarioMongoDb>();
            ScenarioMongoDb scenarioOne = new ScenarioMongoDb();
            scenarioOne.DomainId = Guid.NewGuid();
            scenarioOne.DbObjectId = ObjectId.GenerateNewId();
            scenarioOne.UriOne = "www.bbc.co.uk";
            scenarioOne.UriTwo = "www.cnn.com";

            ScenarioMongoDb scenarioTwo = new ScenarioMongoDb();
            scenarioTwo.DomainId = Guid.NewGuid();
            scenarioTwo.DbObjectId = ObjectId.GenerateNewId();
            scenarioTwo.UriOne = "www.amazon.com";
            scenarioTwo.UriTwo = "www.microsoft.com";

            ScenarioMongoDb scenarioThree = new ScenarioMongoDb();
            scenarioThree.DomainId = Guid.NewGuid();
            scenarioThree.DbObjectId = ObjectId.GenerateNewId();
            scenarioThree.UriOne = "www.greatsite.com";
            scenarioThree.UriTwo = "www.nosuchsite.com";
            scenarioThree.UriThree = "www.neverheardofsite.com";

            scenarios.Add(scenarioOne);
            scenarios.Add(scenarioTwo);
            scenarios.Add(scenarioThree);
            Task addManyScenariosTask = context.Scenarios.InsertManyAsync(scenarios);

            List<LoadtestMongoDb> loadtests = new List<LoadtestMongoDb>();
            LoadtestMongoDb ltOne = new LoadtestMongoDb();
            ltOne.DomainId = Guid.NewGuid();
            ltOne.DbObjectId = ObjectId.GenerateNewId();
            ltOne.AgentId = amazon.DomainId;
            ltOne.CustomerId = niceCustomer.DomainId;
            ltOne.EngineerId = john.DomainId;
            ltOne.LoadtestTypeId = stressTest.DomainId;
            DateTime ltOneStart = DateTime.UtcNow;
            ltOne.Parameters = new LoadtestParametersMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                DurationSec = 60,
                StartDateUtc = ltOneStart,
                UserCount = 10,
                ExpectedEndDateUtc = ltOneStart.AddSeconds(60)
            };
            ltOne.ProjectId = firstProject.DomainId;
            ltOne.ScenarioId = scenarioOne.DomainId;

            LoadtestMongoDb ltTwo = new LoadtestMongoDb();
            ltTwo.DomainId = Guid.NewGuid();
            ltTwo.DbObjectId = ObjectId.GenerateNewId();
            ltTwo.AgentId = azure.DomainId;
            ltTwo.CustomerId = greatCustomer.DomainId;
            ltTwo.EngineerId = mary.DomainId;
            ltTwo.LoadtestTypeId = capacityTest.DomainId;
            DateTime ltTwoStart = DateTime.UtcNow.AddMinutes(20);
            ltTwo.Parameters = new LoadtestParametersMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                DurationSec = 120,
                StartDateUtc = ltTwoStart,
                UserCount = 40,
                ExpectedEndDateUtc = ltTwoStart.AddSeconds(120)
            };
            ltTwo.ProjectId = secondProject.DomainId;
            ltTwo.ScenarioId = scenarioThree.DomainId;

            LoadtestMongoDb ltThree = new LoadtestMongoDb();
            ltThree.DomainId = Guid.NewGuid();
            ltThree.DbObjectId = ObjectId.GenerateNewId();
            ltThree.AgentId = rackspace.DomainId;
            ltThree.CustomerId = okCustomer.DomainId;
            ltThree.EngineerId = fred.DomainId;
            ltThree.LoadtestTypeId = stressTest.DomainId;
            DateTime ltThreeStart = DateTime.UtcNow.AddMinutes(30);
            ltThree.Parameters = new LoadtestParametersMongoDb()
            {
                DbObjectId = ObjectId.GenerateNewId(),
                DurationSec = 180,
                StartDateUtc = ltThreeStart,
                UserCount = 50,
                ExpectedEndDateUtc = ltThreeStart.AddSeconds(180)
            };
            ltThree.ProjectId = thirdProject.DomainId;
            ltThree.ScenarioId = scenarioTwo.DomainId;

            loadtests.Add(ltOne);
            loadtests.Add(ltTwo);
            loadtests.Add(ltThree);
            Task addManyLoadtestsTask = context.Loadtests.InsertManyAsync(loadtests);

            Task.WaitAll(addManyAgentsTask, addManyCustomersTask, addManyEngineersTask, addManyLoadtestTypesTask
                , addManyProjectsTask, addManyScenariosTask, addManyLoadtestsTask);
        }