使用Entity Framework更新读取值

时间:2015-01-28 17:32:15

标签: c# entity-framework entity-framework-6

当我从数据库中读取新闻时,我需要更新视图的数量,以便我知道有多少人阅读过它。

要阅读我的新闻(使用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?

2 个答案:

答案 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();