存储过程中未返回忽略的属性

时间:2015-10-01 14:06:57

标签: c# sql entity-framework stored-procedures ef-fluent-api

我有博客模型和博客评论模型。该博客有一系列与之相关的博客评论,但是当我获取所有博客以便我可以在某种摘要页面上列出时,我不想将所有评论都拉出来。好吧,当我选择一个特定的博客并进入它的页面时,我只需要评论。但是,我确实希望评论的计数显示在摘要部分。

我已经创建了一个用于检索博客的存储过程,这些博客不会返回任何评论,但会返回与博客相关的评论计数值。

选择特定博客时,我会简单地让EF为我抓取它,而不是使用存储过程。

我遇到的问题是我不希望评论计数成为博客表中的一列,所以最初我认为我应该使用流畅的api在OnModelCreating方法中忽略它。但是,这意味着当我运行我的存储过程时,它不会返回我的存储过程应该给我的值。

博客课程:

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也始终为零。

我想我明白为什么会这样,我只是想不出解决方案。

2 个答案:

答案 0 :(得分:0)

TBH,我刚刚在{CommentCount的Count中发出get来电。

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

答案 1 :(得分: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);
}