Remove()
        {
            DatabaseCourseRepository r;

            Setup();
            string name = Guid.NewGuid().ToString("N");

            using (var db = new DemoDbContext())
            {
                r = new DatabaseCourseRepository(db);
                var course = new Course(name);
                r.Add(course);
                r.Remove(course);
                Assert(!r.All.Any(c => c.Name == name));
                db.SaveChanges();
            }
            using (var db = new DemoDbContext())
            {
                r = new DatabaseCourseRepository(db);
                var course = new Course(name);
                r.Add(course);
                db.SaveChanges();
            }
            using (var db = new DemoDbContext())
            {
                r = new DatabaseCourseRepository(db);
                var course = r.All.Single(c => c.Name == name);
                r.Remove(course);
                db.SaveChanges();
            }
            using (var db = new DemoDbContext())
            {
                r = new DatabaseCourseRepository(db);
                Assert(!r.All.Any(c => c.Name == name));
            }
        }
        public ActionResult Course(Course course)
        {
            string courseName = (RouteData.Values["courseName"] ?? "").ToString().Trim();
            string action     = (Request.Form["action"] ?? "").Trim().ToLowerInvariant();

            bool deleting   = (action == "delete" && courseName != "");
            bool creating   = (!deleting && courseName == "");
            bool updating   = (!deleting && !creating);
            bool cancelling = (action == "cancel");

            ViewBag.CourseName = courseName;
            ViewBag.Creating   = creating;
            ViewBag.Updating   = updating;

            if (cancelling)
            {
                if (creating)
                {
                    return(RedirectToRoute("Courses"));
                }
                else
                {
                    return(RedirectToRoute("Course", new { courseName = courseName }));
                }
            }

            if (!ModelState.IsValid)
            {
                return(View(course));
            }

            using (var db = new DemoDbContext())
            {
                ICourseRepository courses  = new DatabaseCourseRepository(db);
                Course            existing =
                    !creating
                ? courses.All.Single(c => c.Name == courseName)
                : null;

                if (deleting)
                {
                    courses.Remove(existing);
                    db.SaveChanges();
                    return(RedirectToRoute("Courses"));
                }

                try
                {
                    if (creating)
                    {
                        courses.Add(course);
                    }
                    else
                    {
                        course.CopyShallowTo(existing);
                    }
                }
                catch (InvalidOperationException ioe)
                {
                    ModelState.AddModelError("", ioe.Message);
                }
                catch (ArgumentException ae)
                {
                    ModelState.AddModelError("", ae.Message);
                }

                if (!ModelState.IsValid)
                {
                    return(View(course));
                }

                db.SaveChanges();
                return(RedirectToRoute("Course", new { courseName = course.Name }));
            }
        }