我正在开发一个ASP NET MVC 5网站,我想在新的一天,一个月和一年的开始只修改一次DbSet的元素,但我在互联网上找不到任何这样的例子,关于如何做到这一点的任何帮助?
我想说:
public class File
{
public int FileID { get; set; }
public int Votes { get; set; }
}
和
public DbSet<File> Files { get; set; }
我想在新的一天开始时将文件投票改为0:
var modFile = new File{ FileID = 2, Votes = 0};
db.Entry(modFile).State = EntityState.Modified;
db.SaveChanges();
我在MVC 5项目中放置此代码? 它是如何被触发的?
答案 0 :(得分:1)
如果你有一个外部服务层(独立于.NET),它包含你的对象(在你的情况下,File.cs等等),那么使用内置的Windows scheduler就可以了(它会在某个时间触发可执行代码,如用户所定义的那样。
为此,您可能希望创建一个控制台应用程序,该应用程序具有对服务dll和数据库连接的引用。
控制台应用
在Visual Studio中,转到文件 - &gt;新项目 - &gt; Visual C# - &gt;控制台应用程序。
在App.config文件中,您可以将连接字符串添加到数据库中。例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="SchoolDBConnectionString"
connectionString="Data Source=...;Initial Catalog=...;Integrated Security=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
然后,您可以设置对Service.dll的引用,该引用应该可以访问数据库上下文,例如DataContext db = MyService.Data.DataContext();
所以而不是:
var modFile = new File{ FileID = 2, Votes = 0};
db.Entry(modFile).State = EntityState.Modified;
db.SaveChanges();
您可以使用:
db.Files.Where(s => s.Votes > 0).ToList().ForEach(s => s.Votes = 0);
db.SavesChanges();
您可以在发布模式下运行项目并获取相关的dll&exe文件。在任务计划程序中,您可以创建运行特定exe的任务。
<强>服务强>
从技术上讲,你不必有这种程度的孤立 - 但在我看来,这是一种很好的做法。您可以创建一个对MVC项目的引用,但我个人不会。
创建服务图层..
右键单击您的解决方案(您的MVC应用程序所在的位置) - &gt;添加 - &gt;新项目 - &gt; Visual C# - &gt;班级图书馆
在此项目中,您应该在此处移动所有对象(File.cs等)。然后,您可以通过右键单击“引用”并选择刚刚创建的服务库,在MVC项目中创建对此项目的引用。您可以对控制台应用程序执行相同的操作。
然后,这将在您的MVC应用程序和具体(业务)逻辑之间创建一层隔离。
否则,如果你必须在ASP.NET中安排你的任务,请查看Scott Hanselman的post - 他已经汇总了一些在某些时候安排工作的图书馆列表。然而,了解ASP.NET应用程序应该只真正处理用户请求和响应 - 线程有点危险,这一点很重要。