private BlogPost CreatePost(int index, Blog blog, IList<User> users, Random random) { var month = 12 - (index * 2) / 28; var day = 28 - (index * 2) % 28; var title = blog.Name + " Post " + index; var user = users[random.Next(users.Count)]; var hour = random.Next(23); var minute = random.Next(59); var second = random.Next(59); var post = new BlogPost { Title = title, PublishDate = new DateTime(2011, month, day, hour, minute, second), Author = user, Blog = blog }; for (int i = 0; i < random.Next(10); i++) { var comment = new Comment { Content = "Comment " + i, PublishDate = new DateTime(2011, month, day, random.Next(23), random.Next(59), random.Next(59)) }; post.AddComment(comment); } post.Content = post.Title + " content"; return post; }
public void AddComment(Comment comment) { Comments.Add(comment); comment.BlogPost = this; }
public void Different_relations_on_same_entity_can_be_loaded_in_separate_queries_using_caching_repository() { Repository.IsEntityCachingEnabled = true; Repository.DefaultConvention = new BlogConvention(); var blog1 = new Blog { Name = "Blog 1", }; var blog2 = new Blog { Name = "Blog 2", }; var post1 = new BlogPost { Title = "Blog post 1", Content = "Post 1 content", PublishDate = new DateTime(2011, 1, 1), }; var post2 = new BlogPost { Title = "Blog post 2", Content = "Post 2 content", PublishDate = new DateTime(2011, 2, 2), }; var comment1 = new Comment { Content = "Comment 1", PublishDate = new DateTime(2011, 1, 5) }; var comment2 = new Comment { Content = "Comment 2", PublishDate = new DateTime(2011, 1, 6) }; var comment3 = new Comment { Content = "Comment 2", PublishDate = new DateTime(2011, 1, 6) }; var user = new User { Username = "******", Password = "******" }; user.AddBlogPost(post1); user.AddBlogPost(post2); blog1.AddPost(post1); blog2.AddPost(post2); post1.AddComment(comment1); post1.AddComment(comment2); post2.AddComment(comment3); Repository.Insert(user); Repository.Insert(blog1, blog2); Repository.Insert(post1, post2); Repository.Insert(comment1, comment2, comment3); var actualPosts = Repository.Find<BlogPost>() .OrderBy(x => x.Title) .OrderBy<Comment>(x => x.Content) .Join<BlogPost, Comment>(x => x.Comments, x => x.BlogPost) .ExecuteList(); var firstActualPost1 = Repository.Find<BlogPost>() .Join<Blog, BlogPost>(x => x.Posts, x => x.Blog) .Where(x => x.Id == post1.Id) .OrderBy(x => x.Title) .Execute(); var secondActualPost1 = Repository.Find<BlogPost>() .Join<User, BlogPost>(x => x.BlogPosts, x => x.Author) .Where(x => x.Id == post1.Id) .Execute(); // Set up the original entities according to the expected result post2.Author = null; post2.Blog = null; Assert.AreEqual(2, actualPosts.Count); Assert.AreEqual(post1, actualPosts[0]); Assert.AreEqual(post2, actualPosts[1]); Assert.AreSame(firstActualPost1, actualPosts[0]); Assert.AreSame(secondActualPost1, actualPosts[0]); }
public void One_way_child_to_parent_relationship_of_a_joined_table_can_be_loaded_with_another_join() { Repository.Convention = new BlogConvention(); var user1 = new User("kalle", "password"); var user2 = new User("pelle", "password"); var blog = new Blog("blog 1"); Repository.Insert(blog); Repository.Insert(user1, user2); var post1 = new BlogPost("title 1", "content 1") { Blog = blog }; var post2 = new BlogPost("title 2", "content 2") { Blog = blog }; Repository.Insert(post1, post2); var comment1 = new Comment("comment 1") { User = user1, BlogPost = post1 }; var comment2 = new Comment("comment 2") { User = user2, BlogPost = post1 }; var comment3 = new Comment("comment 3") { User = user1, BlogPost = post2 }; Repository.Insert(comment1, comment2, comment3); var actualPost = Repository.Find<BlogPost>() .Where(x => x.Id == post1.Id) .OrderBy<Comment>(x => x.Content) .Join(x => x.Comments, x => x.BlogPost) .Join<User, Comment>(x => x.User) .Execute(); Assert.AreEqual("title 1", actualPost.Title); Assert.AreEqual("comment 1", actualPost.Comments[0].Content); Assert.AreEqual("comment 2", actualPost.Comments[1].Content); Assert.AreEqual(2, actualPost.Comments.Count); Assert.IsNotNull(actualPost.Comments[0].User); Assert.IsNotNull(actualPost.Comments[1].User); Assert.AreEqual("kalle", actualPost.Comments[0].User.Username); Assert.AreEqual("pelle", actualPost.Comments[1].User.Username); }
public virtual void Multi_level_relationship_directed_from_middle_level_out_to_parent_and_to_child_can_be_read_with_two_way_relations() { Repository.DefaultConvention = new BlogConvention(); var blog1 = new Blog { Name = "Blog 1", }; var blog2 = new Blog { Name = "Blog 2", }; var post1 = new BlogPost { Title = "Blog post 1", Content = "Post 1 content", PublishDate = new DateTime(2011, 1, 1), }; var post2 = new BlogPost { Title = "Blog post 2", Content = "Post 2 content", PublishDate = new DateTime(2011, 1, 2) }; var post3 = new BlogPost { Title = "Blog post 3", Content = "Post 3 content", PublishDate = new DateTime(2011, 1, 3) }; var comment1 = new Comment { Content = "Comment 1", PublishDate = new DateTime(2011, 1, 5) }; var comment2 = new Comment { Content = "Comment 2", PublishDate = new DateTime(2011, 1, 6) }; var comment3 = new Comment { Content = "Comment 3", PublishDate = new DateTime(2011, 1, 7) }; var comment4 = new Comment { Content = "Comment 4", PublishDate = new DateTime(2011, 1, 8) }; var comment5 = new Comment { Content = "Comment 5", PublishDate = new DateTime(2011, 1, 9) }; blog1.AddPost(post1); blog1.AddPost(post2); blog2.AddPost(post3); post1.AddComment(comment1); post1.AddComment(comment2); post1.AddComment(comment3); post2.AddComment(comment4); post2.AddComment(comment5); Repository.Insert(blog1, blog2); Repository.Insert(post1, post2, post3); Repository.Insert(comment1, comment2, comment3, comment4, comment5); var actualBlogPosts = Repository.Find<BlogPost>().Where(x => x.PublishDate >= new DateTime(2011, 1, 2)) .OrderBy(x => x.PublishDate) .OrderBy<Comment>(x => x.Content) .Join<BlogPost, Comment>(x => x.Comments, x => x.BlogPost) .Join<Blog, BlogPost>(x => x.Posts, x => x.Blog) .ExecuteList(); Assert.AreEqual(2, actualBlogPosts.Count); Assert.AreEqual(post2, actualBlogPosts[0]); Assert.AreEqual(post3, actualBlogPosts[1]); // Post1 does not match the filter condition of the query, so that won't be in the result // Hence, remove that post from the expected blog, so that we can use the Equals method // to compare the expected with the actual blog1.Posts.Remove(post1); Assert.AreEqual(blog1, actualBlogPosts[0].Blog); Assert.AreEqual(blog2, actualBlogPosts[1].Blog); var actualBlog1 = actualBlogPosts[0].Blog; var actualBlog2 = actualBlogPosts[1].Blog; Assert.AreEqual(1, actualBlog1.Posts.Count); Assert.AreEqual(1, actualBlog2.Posts.Count); Assert.AreSame(actualBlogPosts[0], actualBlog1.Posts.First()); Assert.AreSame(actualBlogPosts[1], actualBlog2.Posts.First()); actualBlogPosts[0].Comments.ToList().ForEach(x => Assert.AreSame(actualBlogPosts[0], x.BlogPost)); actualBlogPosts[1].Comments.ToList().ForEach(x => Assert.AreSame(actualBlogPosts[1], x.BlogPost)); }
public virtual void Multi_level_relationship_directed_from_child_to_parent_can_be_written_and_read_back_in_single_query() { Repository.DefaultConvention = new BlogConvention(); var blog1 = new Blog { Name = "Blog 1", }; var blog2 = new Blog { Name = "Blog 2", }; var post1 = new BlogPost { Title = "Blog post 1", Content = "Post 1 content", PublishDate = new DateTime(2011, 1, 1), }; var post2 = new BlogPost { Title = "Blog post 2", Content = "Post 2 content", PublishDate = new DateTime(2011, 1, 2) }; var post3 = new BlogPost { Title = "Blog post 3", Content = "Post 3 content", PublishDate = new DateTime(2011, 1, 3) }; var comment1 = new Comment { Content = "Comment 1", PublishDate = new DateTime(2011, 1, 5) }; var comment2 = new Comment { Content = "Comment 2", PublishDate = new DateTime(2011, 1, 6) }; var comment3 = new Comment { Content = "Comment 3", PublishDate = new DateTime(2011, 1, 7) }; var comment4 = new Comment { Content = "Comment 4", PublishDate = new DateTime(2011, 1, 8) }; var comment5 = new Comment { Content = "Comment 5", PublishDate = new DateTime(2011, 1, 9) }; blog1.AddPost(post1); blog1.AddPost(post2); blog2.AddPost(post3); post1.AddComment(comment1); post1.AddComment(comment2); post1.AddComment(comment3); post2.AddComment(comment4); post2.AddComment(comment5); Repository.Insert(blog1, blog2); Repository.Insert(post1, post2, post3); Repository.Insert(comment1, comment2, comment3, comment4, comment5); var actualComments = Repository.Find<Comment>().Where(x => x.PublishDate >= new DateTime(2011, 1, 6)) .OrderBy(x => x.PublishDate) .Join<BlogPost, Comment>(x => x.Comments, x => x.BlogPost) .Join<Blog, BlogPost>(x => x.Posts, x => x.Blog) .ExecuteList(); // Since comment1 has a PublishDate before 2011-01-06 it will not be returned by the query. // Because of this the instance of post1 returned will not have comment1 in its Comments collection. // So, to make the asserts correct. That comment is removed from the original post1. post1.Comments.Remove(comment1); Assert.AreEqual(4, actualComments.Count); Assert.AreEqual(comment2, actualComments[0]); Assert.AreEqual(comment3, actualComments[1]); Assert.AreEqual(comment4, actualComments[2]); Assert.AreEqual(comment5, actualComments[3]); Assert.AreEqual(post1, actualComments[0].BlogPost); Assert.AreEqual(post2, actualComments[2].BlogPost); Assert.AreEqual(blog1, actualComments[0].BlogPost.Blog); Assert.AreSame(actualComments[0].BlogPost, actualComments[1].BlogPost); Assert.AreSame(actualComments[2].BlogPost, actualComments[3].BlogPost); Assert.AreSame(actualComments[0].BlogPost.Blog, actualComments[1].BlogPost.Blog); Assert.AreSame(actualComments[0].BlogPost.Blog, actualComments[2].BlogPost.Blog); Assert.AreSame(actualComments[0].BlogPost.Blog, actualComments[3].BlogPost.Blog); }
public virtual void Multi_level_relationship_can_be_written_and_read_back_again_in_single_query_using_join() { Repository.DefaultConvention = new BlogConvention(); var blog1 = new Blog { Name = "Blog 1", }; var blog2 = new Blog { Name = "Blog 2", }; var blog3 = new Blog { Name = "Blog 3", }; var blog4 = new Blog { Name = "Blog 4", }; var post1 = new BlogPost { Title = "Blog post 1", Content = "Post 1 content", PublishDate = new DateTime(2011, 1, 1), }; var post2 = new BlogPost { Title = "Blog post 2", Content = "Post 2 content", PublishDate = new DateTime(2011, 1, 2) }; var post3 = new BlogPost { Title = "Blog post 3", Content = "Post 3 content", PublishDate = new DateTime(2011, 1, 3) }; var post4 = new BlogPost { Title = "Blog post 4", Content = "Post 4 content", PublishDate = new DateTime(2011, 1, 4) }; var comment1 = new Comment { Content = "Comment 1", PublishDate = new DateTime(2011, 1, 5) }; var comment2 = new Comment { Content = "Comment 2", PublishDate = new DateTime(2011, 1, 6) }; var comment3 = new Comment { Content = "Comment 3", PublishDate = new DateTime(2011, 1, 7) }; blog1.AddPost(post1); blog1.AddPost(post2); blog2.AddPost(post3); blog4.AddPost(post4); post1.AddComment(comment1); post2.AddComment(comment2); post2.AddComment(comment3); Repository.Insert(blog1, blog2, blog3, blog4); Repository.Insert(post1, post2, post3, post4); Repository.Insert(comment1, comment2, comment3); var actualBlogs = Repository.Find<Blog>().Where(x => x.Name == "Blog 1" || x.Name.EndsWith("3")) .OrderBy(x => x.Name) .OrderBy<BlogPost>(x => x.Title) .OrderBy<Comment>(x => x.Content) .Join<Blog, BlogPost>(x => x.Posts, x => x.Blog) .Join<BlogPost, Comment>(x => x.Comments, x => x.BlogPost) .ExecuteList(); Assert.AreEqual(2, actualBlogs.Count); Assert.AreEqual(blog1, actualBlogs[0]); Assert.AreEqual(blog3, actualBlogs[1]); }