2015-10-01 2 views
0

У меня есть модель блога и модель комментариев блога. В блоге есть коллекция комментариев к блогу, связанных с ним, однако, когда я получаю все свои блоги, чтобы я мог их перечислить на какой-то странице резюме, я тоже не хочу получать все комментарии, я только нужны комментарии, когда я выбираю конкретный блог и перехожу на его страницу. Тем не менее, я хочу, чтобы количество комментариев отображалось в сводном разделе.Игнорированное свойство, не возвращенное в хранимой процедуре

Я создал хранимую процедуру для извлечения блогов, которые не возвращают комментарии, но возвращает значение для количества комментариев, связанных с блогом.

При выборе конкретного блога я просто позволю EF захватить его для меня, а не использовать хранимую процедуру.

Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу, чтобы счетчик комментариев был столбцом в таблице блога, поэтому изначально я думал, что должен игнорировать его в методе OnModelCreating, используя свободное api. Однако это означает, что когда я запускаю свою хранимую процедуру, она не возвращает значение, которое должна мне предоставить моя хранимая процедура.

Блог Класс:

public class Blog 
{ 
    public Guid BlogGuid { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public string Author { get; set; } 
    public DateTime DatePosted { get; set; } 
    public IList<BlogComment> Comments { get; set; } 
    public int CommentCount { get; set; } 

    public Blog() 
    { 
     Comments = new List<BlogComment>(); 
    } 
} 

Блог Комментарий Класс:

public class BlogComment 
{ 
    public Guid BlogCommentGuid { get; set; } 
    public Guid BlogGuid { get; set; } 
    public int ContactRef { get; set; } 
    public DateTime DatePosted { get; set; } 
    public string Text { get; set; } 
} 

OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    var blog = modelBuilder.Entity<Blog>(); 
    blog.ToTable("Blogs"); 
    blog.HasKey(b => b.BlogGuid); 
    blog.HasMany(b => b.Comments).WithRequired().HasForeignKey(c => c.BlogGuid); 
    blog.Ignore(b => b.CommentCount); 

    var blogComment = modelBuilder.Entity<BlogComment>(); 
    blogComment.ToTable("BlogComments"); 
    blogComment.HasKey(c => c.BlogCommentGuid); 
} 

Получить Блоги Метод:

public IList<Blog> GetBlogs() 
{ 
    return context.Database.SqlQuery<Blog>("Get_Blogs").ToList(); 
} 

хранимой процедуры Код:

CREATE TABLE #Blogs 
(
    BlogGuid uniqueidentifier, 
    Title nvarchar(50), 
    Text nvarchar(MAX), 
    Author nvarchar(50), 
    DatePosted datetime 
) 

IF (@BlogCount IS NOT NULL AND @BlogCount > 0) 
BEGIN 
    INSERT INTO #Blogs 
     SELECT TOP (@BlogCount) * 
      FROM Blogs 
      ORDER BY DatePosted DESC 
END ELSE BEGIN 
    INSERT INTO #Blogs 
     SELECT * 
      FROM Blogs 
      ORDER BY DatePosted DESC 
END 

SELECT *, 

    (SELECT COUNT(*) 
     FROM BlogComments 
     WHERE BlogComments.BlogGuid = #Blogs.BlogGuid) CommentCount 

FROM #Blogs 

DROP TABLE #Blogs 

При вызове GetBlogs(), CommentCount всегда равна нулю, даже если блоги есть комментарии в блоге комментарий таблицы.

Думаю, я понимаю, почему это происходит, я просто не могу придумать решение.

ответ

0

Я считаю, что у меня есть решение для этого, которое должно создать суперкласс для блога под названием BlogSummary, который имеет свойство CommentCount на нем. Затем я установил это для игнорирования в методе OnModelCreating.

BlogSummary:

public class BlogSummary: Blog 
{ 
    public int CommentCount { get; set; } 
} 

OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Blog 
    var blog = modelBuilder.Entity<Blog>(); 
    blog.ToTable("Blogs"); 
    blog.HasKey(b => b.BlogGuid); 
    blog.HasMany(b => b.Comments).WithRequired().HasForeignKey(c => c.BlogGuid); 

    // Blog Summary 
    modelBuilder.Ignore<BlogSummary>(); 

    // Blog Comment 
    var blogComment = modelBuilder.Entity<BlogComment>(); 
    blogComment.ToTable("BlogComments"); 
    blogComment.HasKey(c => c.BlogCommentGuid); 
} 
0

TBH, я просто поместил бы вызов Count в get комментария `CommentCount.

public int CommentCount { get { return this.Comments.Count; } set; } 
+0

Конечно, это означает, что я извлечения всех комментариев, так что я могу считать их хотя? Этого я пытаюсь избежать - ненужно загружать все комментарии, где я им не нужен. –

+0

@ AndyFurniss беспокоится о том, чтобы сначала начать работу. Если после этого вы обнаружите, что у вас проблемы с производительностью, вы можете работать над такими оптимизациями. – user1666620

+0

Да, у меня все было без работы с этим комментарием, а затем начал пытаться реализовать его, как только я понял, что бессмысленно возвращать все комментарии из базы данных.Подсчет комментариев в базе данных, безусловно, менее дорогостоящий, чем отправка их через Интернет? –