2014-12-19 33 views
0

我正在一個ASP NET MVC 5網站上工作,我想在新的一天,一個月和一年的開始時只修改一次DbSet的元素,但我在Internet上找不到任何示例,有關如何做到這一點的任何幫助?如何在特定時間修改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

由於用戶請求,Web應用程序應該採取行動。從您的Web應用程序內部進行預定活動是不合適的。 –

+0

你能指點我一個教程嗎? –

+0

關於未執行預定操作的教程?不,不是。 –

回答

1

如果你有一個包含你的對象的外部服務層(這是獨立於.NET)(在你的情況下,File.cs等),然後使用內置的Windows scheduler是好的(它觸發可執行用戶定義的特定時間的代碼)。

爲此,您可能需要創建一個控制檯應用程序,該應用程序具有對服務dll的引用以及數據庫的連接。

控制檯應用程序

在Visual Studio中,轉到文件 - >新建項目 - >的Visual C# - >控制檯應用程序。

在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項目中創建對此項目的引用。您可以對控制檯應用程序執行相同的操作。

這會在您的MVC應用程序和具體(業務)邏輯之間創建一個隔離層。

否則,如果您必須在ASP.NET內安排您的任務,請查看Scott Hanselman的post - 他編譯了一個在特定時間安排作業的庫列表。理解ASP.NET應用程序應該只有確實處理用戶請求和響應是非常重要的 - 線程有點危險。

+0

一直在搜索,無法找到關於如何創建consoleApplication的教程,將其連接到我的數據庫並修改它?你知道任何鏈接嗎? –

+0

我編輯了我的問題。希望能幫助到你? – Rhys

+0

模型和上下文(與我的網站有關的所有內容)的文件夾已創建,並位於我的MVC項目中,您是否也可以描述如何在此情況下爲組合打破程度超完全的答案創建服務dll? –