当我从数据库中读取新闻时,我需要更新视图的数量,以便我知道有多少人阅读过它。
要阅读我的新闻(使用Automapper):
public virtual ActionResult Detail(string urlSlug)
{
NewsDetailVM vm = db.News.Where(n => n.UrlSlug.Equals(urlSlug)).Project().To<NewsDetailVM>().FirstOrDefault();
return View(vm);
}
域名实体新闻是:
public class News
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Meta { get; set; }
public string UrlSlug { get; set; }
public DateTime DatePostedOn { get; set; }
public bool Popular { get; set; }
public int Position { get; set; }
public int Views { get; set; }
public Category Category { get; set; }
public virtual ICollection<Picture> Pictures { get; set; }
}
有没有办法选择更新,所以我可以在Views属性中添加+1?
答案 0 :(得分:0)
仅使用实体框架,您必须编写在读取时增加视图值并调用SaveChanges()的代码。
我不能在我的行中做到这一点?
不,你必须写下这样的话:
var news = db.News.Where(n => n.UrlSlug.Equals(urlSlug))
.ToList();
foreach(var new in news)
{
new.Views += 1;
}
db.SaveChanges();
NewsDetailVM vm = news.Project().To<NewsDetailVM>().FirstOrDefault();
要意识到如果你要撤回数百或更多的记录SaveChanges();
需要相当长的时间,并且代码需要更新以进行更小的批量处理(取决于SQL Server的速度)
答案 1 :(得分:0)
我会通过直接查询(使用ObjectContext.ExecuteStoreCommand
)来执行此操作,例如:
// beware of sql injections
db.ExecuteStoreCommand("UPDATE News SET Views = Views + 1 WHERE urlSlug = '{0}'", urlSlug);
还有Entity Framework Extended应该允许批量更新,这允许在IQueryable
上执行表达式,例如:
var newsFilter = db.News.Where(n => n.UrlSlug.Equals(urlSlug))
db.News.Update(newsFilter, t => t.View = t.View + 1);
您可以像以前一样投影它,而无需定义相同的IQueryable
两次,例如:
NewsDetailVM vm = newsFilter.Project().To<NewsDetailVM>().FirstOrDefault();