如何首先删除asp.net mvc代码的陈旧数据?

时间:2014-03-18 14:24:28

标签: asp.net-mvc entity-framework linq-to-entities

我使用entityFramewrok开发了一个asp.net mvc应用程序,代码首先在我的应用程序中我有一个类映射到具有以下属性的表

public class Comments
 {
    public int Id{ get; set; }
    public string Comment { get; set; }
    public DateTime LastEdit{ get; set; }

}

我希望我的应用能够自动删除(删除)超过40天的评论。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

这与您发布的类或ASP.NET,MVC甚至实体框架无关。这只是关于安排每天运行的任务,这将识别数据并将其删除。

基本上你有两个主要选择......

1)创建Windows服务。这将包括Timer,它被设置为每24小时执行一次(或您认为合适的任何其他间隔)。由Timer调用的操作将连接到数据库,标识要删除的记录并删除它们。

2)创建控制台应用程序。这不会在内部运行任何类型的计划,但只会执行连接到数据库的一次性操作,识别要删除的记录并删除它们。该应用程序将被安排使用主机系统的任务调度程序定期运行(再次,每天听起来合理)。

使用Web应用程序使用的相同实体框架代码是有意义的,因此您需要确保代码位于其自己的类库项目中,然后Web应用程序和Windows服务都将引用该项目

相反,如果您需要将此本地保留在Web应用程序本身,那么应用程序需要执行此操作以响应某种请求。这会损害应用程序的性能,但它仍然可能。只要用户请求给定页面,您就可以先执行这些删除操作,然后返回请求的视图。同样,这不理想因为它意味着每天多次这样做并且中断用户体验(即使只是片刻)。最好将后台数据维护卸载到脱机应用程序,例如Windows服务或控制台应用程序。

答案 1 :(得分:0)

1。您可以为此在数据库中创建触发器。

2。正如David所说,使用Windows服务或控制台应用程序创建一个连接到数据库的应用程序并执行以下操作:

public void DeleteOldComments()
{
  var monthAgo = DateTime.Now.AddMonths(-1);
  var oldComments = Db.CommentsTable.Where(e => e.DateTime <= monthAgo);
  foreach (var item in oldComments )
  {
      var e = Db.CommentsTable.Find(item.Id);
      if (e != null)
      {
           Db.CommentsTable.Remove(e);
      }
  }
}

第3。漫长而糟糕的方式:创建设置表,并在您的网站布局中保存 LastCommentDeleteDate ,使用javascript调用一天中一次触发DeleteOldComments()的任何操作。 (使用cookie)。在任何请求中检查 LastCommentDeleteDate ,如果允许,请调用删除功能。