public ActionResult AddProjectConfig(string projectName)
        {
            if (string.IsNullOrWhiteSpace(projectName))
                return View("Error");

            Project project;

            using (var db = new BuildVersioningDataContext())
            {
                project =
                    db.Projects
                        .SingleOrDefault(p =>
                            string.Compare(p.Name, projectName, StringComparison.OrdinalIgnoreCase) == 0
                            );
            }

            if (null == project)
                return View("Error");

            var model =
                new AddProjectConfigModel
                {
                    ParentProjectId = project.Id,
                    ParentProjectName = project.Name
                };
            return View(model);
        }
        public ActionResult AddProjectConfig(AddProjectConfigModel addProjectConfig)
        {
            if (null == addProjectConfig)
                return View("Error");

            // Validate ParentProjectId
            var parentProjectId = addProjectConfig.ParentProjectId;
            if (parentProjectId < 1)
                return View("Error");

            // Validate ParentProjectName
            var parentProjectName = addProjectConfig.ParentProjectName;
            if (string.IsNullOrWhiteSpace(parentProjectName))
                return View("Error");

            // Validate Name
            var name = addProjectConfig.Name;
            if (string.IsNullOrWhiteSpace(name))
                return View("Error");

            var desc = addProjectConfig.Description;
            if (string.IsNullOrWhiteSpace(desc))
                desc = null;

            var buildNumberPostion = (int)addProjectConfig.BuildNumberPosition;
            if (buildNumberPostion < 3 || buildNumberPostion > 4)
                return View("Error");

            // Force the GeneratedVersion part that corresponds to the build number position to a value of zero.
            switch (buildNumberPostion)
            {
                case 3:
                    addProjectConfig.GeneratedVersionPart3 = 0;
                    break;
                case 4:
                    addProjectConfig.GeneratedVersionPart4 = 0;
                    break;
            }

            using (var db = new BuildVersioningDataContext())
            {
                if (db.ProjectConfigs
                    .Include(c => c.Project)
                    .Any(c =>
                        c.Project.Id == parentProjectId &&
                        string.Compare(c.Name, name, StringComparison.OrdinalIgnoreCase) == 0
                        ))
                    return View("Error"); // <-- A ProjectConfig with the same parent Project and the same name already exists.

                var projectConfig =
                    new ProjectConfig
                    {
                        Description = desc,
                        GeneratedBuildNumberPosition = buildNumberPostion,
                        GeneratedVersionPart1 = addProjectConfig.GeneratedVersionPart1,
                        GeneratedVersionPart2 = addProjectConfig.GeneratedVersionPart2,
                        GeneratedVersionPart3 = addProjectConfig.GeneratedVersionPart3,
                        GeneratedVersionPart4 = addProjectConfig.GeneratedVersionPart4,
                        Name = name,
                        ProductVersionPart1 = addProjectConfig.ProductVersionPart1,
                        ProductVersionPart2 = addProjectConfig.ProductVersionPart2,
                        ProductVersionPart3 = addProjectConfig.ProductVersionPart3,
                        ProductVersionPart4 = addProjectConfig.ProductVersionPart4,
                        ProjectId = parentProjectId,
                        ReleaseType = addProjectConfig.ReleaseType
                    };

                db.ProjectConfigs.Add(projectConfig);
                db.SaveChanges();
            }

            return RedirectToRoute("ViewProject", new { name = parentProjectName });
        }