簡體   English   中英

ASP.NET MVC 4,遷移 - 如何在生產服務器上運行“update-database”

[英]ASP.NET MVC 4, Migrations - How to run 'update-database' on a production server

我可以使用包管理器在本地運行'update-database -verbose'。

可能是一個愚蠢的問題,但我無法在線找到它 - 一旦部署了我的網站 - 如何在服務器上手動運行?

其次 - 您建議將數據庫遷移部署到生產中的其他策略是什么?它們將如何更好?

謝謝

你有幾個選擇:

  • 您可以使用update-database -script生成SQL命令以更新服務器上的數據庫
  • 您可以使用migrate.exe駐留在包裝上的文件夾中的可執行文件/packages/EntityFramework5.0.0/tools/migrate.exe 我過去曾使用Jet Brains的Team City Build Server成功地使用它來設置我的部署腳本的遷移。
  • 如果您使用的是IIS Web Deploy,則可以告訴服務器在發布后執行遷移(參見下面的圖片)
  • 您可以設置自動遷移,但我更願意控制發生的事情:)

更新:另外,看看Sayed Ibrahim的博客 ,他在微軟的MsBuild團隊工作,並對部署有一些很好的見解

在此輸入圖像描述

我知道這個問題已經得到解答,但供將來參考:

其中一個選項是將這樣的東西放在DB上下文類的構造函數中:

public MyDbContext()
    {
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());            
    }

對我們而言,DBA是唯一可以訪問生產(和預生產)環境的組。 我們只需使用Update-Database -Script包控制台命令來獲取更新數據庫所需的Sql。 這可以傳遞給他們,在那里他們可以驗證它,等等。

對某些人來說可能有點過於簡單,但它有效。

HTH。

一個簡單的解決方案:從本地程序包管理器控制台運行Update-Database ,為生產連接字符串提供連接字符串參數。 您還必須提供連接提供程序名稱(在此示例代碼中為SqlServer):

Update-Database -ConnectionString <your real remote server connection string here> -ConnectionProviderName System.Data.SqlClient

您可以使用app.config文件connectionStrings部分中的連接字符串名稱代替連接字符串:

Update-Database -ConnectionStringName <your connection string name here>

您必須具有從本地計算機訪問該服務器的權限。 例如,如果您能夠從Sql Server Management Studio連接到服務器,則可以使用它。

請注意,不建議將此方法用於實際生產系統,您應該使用類似於已接受答案中解釋的內容。 但它可以幫助您快速破解開發遠程服務器,測試環境等。

我個人喜歡設置每次調用應用程序的start方法時運行的自動遷移。 這樣,您進行的每個部署都可以運行遷移並自動更新應用程序。

看看AppHarbor上的這篇文章。 http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3

要點基本上是要啟用自動遷移,然后從代碼中調用DatabaseInitializer,可以是OnModelCreating方法,也可以是Global.asax。

您可以使用EF命令(update-database -script)獲取腳本,也可以手動編寫腳本。 這不是在生產環境中更新數據庫最重要的事情。 對我來說,最重要的是確保所有腳本都正確運行,並且它們按預期影響了記錄。 在我看來,你應該有一個預生產環境,數據庫應該是生產環境的副本。 這樣,您就可以運行腳本並在非常相似的環境中部署應用程序,並查看是否存在任何問題。 有時腳本在DEV環境中正確執行,但它們在生產環境中失敗。 為避免頭痛,您應該在預生產環境中模擬生產環境。 關於腳本,如果團隊有多個開發人員,我更喜歡在結構腳本和數據腳本中對腳本進行分類。 結構腳本改變數據庫的結構(添加表,向表添加列等)和數據腳本插入/更新/刪除記錄。 此外,每個腳本都應指定其依賴項,以便它們不能以錯誤的順序執行。 在創建表A之前,無法執行在表A中插入行的數據腳本。 這就是我所做的: - 定義一個用於注冊已執行腳本的表。 例如:ExecutedScriptsHistory。 - 每個腳本都有一個數字和一個名稱。 - 執行腳本后,在ExecutedScriptsHistory表中插入一個新行。 - 在執行腳本之前,它會檢查其依賴項。 為此,它會檢查腳本是否已執行(存在於ExecutedScriptsHistory表中)。

運行腳本后,可以檢查是否已執行所有腳本,檢查ExecutedScriptsHistory。 此策略類似於Microsoft在EF Migration中選擇的策略,但您可以完全控制它。

只是為每個人提供簡單的答案。

這是“更新 - 數據庫”在遷移文件夾中,Configuration.cs:

    internal sealed class Configuration : DbMigrationsConfiguration<projectname.Models.dbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true; // Update-Data -Force (deletes columns etc)
    }

要在遠程服務器上首先“啟用遷移”,請將其添加到Global.asax.cs文件中:

        protected void Application_Start()
    {
        ....
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext, Migrations.Configuration>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM