private void DecodeBlogsAndGrades(XElement element, Dictionary<string, Tag> tagsDict)
        {
            Bloggers = new List<Blog>();
            Posts = new List<Post>();
            PostTagGrades = new List<PostTagGrade>();
            foreach (var blogXml in element.Elements("Blog"))
            {
                var newBlogger = new Blog()
                {
                    Name = blogXml.Element("Name").Value,
                    EmailAddress = blogXml.Element("Email").Value,
                    Posts = new Collection<Post>()
                };

                foreach (var postXml in blogXml.Element("Posts").Elements("Post"))
                {
                    var newPost = new Post()
                    {
                        Blogger = newBlogger,
                        Title = postXml.Element("Title").Value,
                        Content = postXml.Element("Content").Value,
                        Tags = postXml.Element("TagSlugs").Value.Split(',').Select(x => tagsDict[x.Trim()]).ToList()
                    };


                    //look for PostTagGrades for this post
                    foreach (var postTagXml in postXml.Elements("PostTagGrade"))
                    {
                        var newPostTag = new PostTagGrade
                        {
                            PostPart = newPost,
                            TagPart = tagsDict[postTagXml.Element("TagSlug").Value.Trim()],
                            Grade = int.Parse( postTagXml.Element("Grade").Value)
                        };
                        PostTagGrades.Add( newPostTag);
                    }
                    Posts.Add(newPost);
                    newBlogger.Posts.Add(newPost);

                }
                Bloggers.Add(newBlogger);
            }
        }
        public void Check11PostTagGradesCopyKeysBackToDtoOk()
        {
            using (var db = new SampleWebAppDb())
            {
                //SETUP
                var timer = new Stopwatch();
                var postTag = new PostTagGrade { PostId = 123, TagId = 456};
                var dto = new SimplePostTagGradeDto();

                //ATTEMPT
                timer.Start();
                dto.AfterCreateCopyBackKeysToDtoIfPresent(db, postTag);
                timer.Stop();

                Console.WriteLine("took {0:f3} ms", 1000.0 * timer.ElapsedTicks / Stopwatch.Frequency);
                //VERIFY
                dto.PostId.ShouldEqual(postTag.PostId);
                dto.TagId.ShouldEqual(postTag.TagId);
            }
        }
        public void Check32DeleteViaRemoveOk()
        {
            using (var db = new SampleWebAppDb())
            {
                //SETUP
                var snap = new DbSnapShot(db);
                var firstPostTagGrades = db.PostTagGrades.AsNoTracking().First();

                //ATTEMPT
                var ptgToDelete = new PostTagGrade
                {
                    PostId = firstPostTagGrades.PostId,
                    TagId = firstPostTagGrades.TagId
                };
                db.PostTagGrades.Attach(ptgToDelete);
                db.PostTagGrades.Remove(ptgToDelete);
                var status = db.SaveChangesWithChecking();

                //VERIFY
                status.IsValid.ShouldEqual(true, status.Errors);
                snap.CheckSnapShot(db, 0, 0, 0, 0, -1);
            }
        }