检索实体框架内的类的数据库计算属性

时间:2015-03-09 02:59:55

标签: c# entity-framework

我对EF有很好的理解,并成功生成了我的数据库。现在,我正在努力为其中一个实体类添加动态属性。例如,我有一个Post类,其他用户可以对帖子发表评论。当我列出现有帖子时,我想显示对相应帖子发表的评论数量。

一个解决方案可能是拥有一个名为CommentCount的属性,并在发出新评论时通过将int属性的(CommentCount)值增加1来更新Post。

另一个解决方案,我认为这是一个更好的解决方案,就是当从数据库中检索帖子时,可以同时计算和检索与帖子关联的评论数量,并将其分配给{{1} post实例的属性。但是,我不知道如何用EF实现这一目标。

强烈推荐哪种方法?或者,还有其他方法吗?如果是第二个,我怎样才能用EF实现这个目标?

2 个答案:

答案 0 :(得分:1)

如果您的计算非常复杂,您应该尝试在数据库中创建一个View,然后将其添加到您的模型中?

但是如果你的模型有简单的东西,比如

class Post {
    public int postid { get; set; }
    public virtual ICollection<comment> comment { get; set; }
}

在您的控制器中,您可以

db.post(x => x.postid == yourid).comments.count() 

获得评论总数

或在您看来

@foreach (var item in Model)
{
    <li>item.postid;</li>
    <li>item.comment.Count();</li>
} 

或更新课程

class Post {
    public int postid { get; set; }
    public virtual ICollection<comment> comment { get; set; }
    public int CommentCount
    {
        get 
        { 
            return comment.Count();
        }
    }

}

请记住在查询中提供相关数据。 在我的情况下,POI有属性parish_id, sector_id, city_id,教区有自治市,市有州。

使用此查询,我可以获取Poi所有相关数据。

filter = db.poi
           .Include("parish")
           .Include("sector")
           .Include("city")
           .Include("parish.municipality")
           .Include("parish.municipality.state")
           .Where(x => x.sector_id == SectorID);

答案 1 :(得分:1)

1)您应该只考虑不要将名为CommentCount的属性添加到您的模型中。当您开发WPF Windows应用程序时,应该考虑使用MVVM patternCommentCount属于您的 ViewModel 类,而不是 Model 上课。在那里实施INotifyPropertyChanged,您可以从前端视图中使用它。类似地,ASP.NET等有MVC模式。

还有其他设计模式,如Repository pattern。使用此模式,您可以在存储库类中创建CommentCount,而不是在您的 模特课。这与您的第二个解决方案类似。

2)我从你的问题中假设你使用的是代码优先方法:

  

成功生成了我的数据库

如果您这样做并且希望将CommentCount直接包含在 Model 类中,则可以通过向项目中添加部分类文件来实现此目的:

namespace DBModel.Models
{
    public partial class Post
    {
        public int CommentsCount
        {
            get { return this.Comments.Count; }
        }
        ...

但我不明白为什么要为你的模型创建额外的属性。

另一方面,将此字段作为计算字段添加到SQL数据库中可能有意义,然后它将成为您的EF模型的一部分。