我对EF有很好的理解,并成功生成了我的数据库。现在,我正在努力为其中一个实体类添加动态属性。例如,我有一个Post
类,其他用户可以对帖子发表评论。当我列出现有帖子时,我想显示对相应帖子发表的评论数量。
一个解决方案可能是拥有一个名为CommentCount
的属性,并在发出新评论时通过将int
属性的(CommentCount
)值增加1来更新Post。
另一个解决方案,我认为这是一个更好的解决方案,就是当从数据库中检索帖子时,可以同时计算和检索与帖子关联的评论数量,并将其分配给{{1} post实例的属性。但是,我不知道如何用EF实现这一目标。
强烈推荐哪种方法?或者,还有其他方法吗?如果是第二个,我怎样才能用EF实现这个目标?
答案 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 pattern,CommentCount
属于您的 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模型的一部分。