我正在一个ASP.NETMVC 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项目中,我把这些代码放在哪里?怎么触发的?
发布于 2014-12-19 21:57:56
如果您有一个外部服务层(独立于.NET),它包含您的对象(在您的例子中,File.cs等等)然后,使用内置的Windows 调度器是可以的(它在特定时间触发可执行代码,这是由用户定义的)。
为此,您可能需要创建一个控制台应用程序,该应用程序具有对Service和数据库连接的引用。
控制台应用程序
在Visual中,转到File -> New Project -> Visual C# -> Console Application。
在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应用程序所在的地方) ->添加->新项目-> Visual C# ->类库
在这个项目中,您应该在这里移动所有对象(File.cs等)。然后,您可以在MVC项目中创建对该项目的引用,方法是右键单击References并选择您刚刚创建的服务库。您可以对控制台应用程序执行同样的操作。
然后,这将在MVC应用程序和具体(业务)逻辑之间创建一个隔离层。
否则,如果您必须在ASP.NET中安排您的任务,请查看Scott的帖子 --他已经编译了一个在特定时间安排作业的库列表。然而,理解ASP.NET应用程序只应该真正处理用户请求和响应是很重要的--线程有点危险。
https://stackoverflow.com/questions/27573718
复制相似问题