2016-01-05 103 views
4

我最近採用ASP.NET MVC開展了一個新項目,並且我對這項技術並不熟悉。我仍然處於早期階段,我即將開始自學如何使用Entity Framework來處理我的數據訪問代碼。我只是遇到了一段相當艱難的時間,使得軟件/工具/功能可以做什麼,但我認爲我正在與EF合作。實體框架和不同的環境(開發/生產)

我正在尋找能夠看到我的本地數據庫與我的生產數據庫(架構,而不是實際的數據)中的差異,並能夠發佈到SQL Server在我們的本地網絡中。在我看來,我認爲它就像數據庫的DVCS一樣。

傳統意義上(像大多數人會說的)我會在自己的代碼或存儲過程中使用SQL編寫自己的數據訪問代碼,我會自己處理數據庫方面的事情。這對我來說不再是一種選擇,但是因爲我需要爲開發和生產建立獨立的環境,並且我沒有時間和意願來手動編寫所有代碼。開發人員將在開發機器本地,生產將託管在本地網絡上的服務器上。

我最近開始在Visual Studio中使用「發佈」功能,並且設法將其設置得很好,將新版本發佈到我的IIS服務器正在查看的目錄中,以便爲網站提供服務。

我使用Git和Sourcetree來處理我的項目代碼的DVCS,但是我從未親自使用過或找到過對數據庫做類似的解決方案。起初我以爲我正在爲SQL Server尋找某種DVCS,但那並沒有太大的回報。本質上,我只是想要某種工具來管理本地和生產數據庫之間的版本差異,我認爲這是EF可以爲我做的事情。

對於數據庫,我使用的是SQL Server。我還沒有爲這個項目建立一個數據庫,所以我想代碼優先的EF將是最好的方法。我想確保EF在SQL Server中使用數據庫,但我相信我可以通過指定要使用的連接字符串來設置,而不是在Visual Studio中使用該數據庫。我偶爾需要通過SSMS訪問數據庫,所以我可以使用索引和備份計劃,這樣我通常可以通過SSMS來完成,但我仍然希望EF爲我完成大部分工作。

  1. 我可以通過實體框架以我希望的方式實現我期望的目標嗎?也就是說,有一個處理數據庫差異和版本間更新的工具? 我不想弄清楚哪些表/列等我已經在本地進行了更改,並且必須以某種方式將其應用到生產數據庫中,但我也不希望生產數據庫中的數據發生更改,只是結構...
  2. 我很樂意爲任何人提供關於如何構建這個設置的建議,甚至鏈接到如何設置它的教程。我確定我不是第一個想做這件事的人,我知道我不會是最後一個。

本質上我只想單擊「發佈」按鈕,並將代碼和數據庫中的所有本地差異發佈到生產服務器。

+1

看一看遷移。 https://msdn.microsoft.com/en-in/data/jj591621.aspx#script – jvanrhyn

回答

3

我是否可以通過實體框架實現我期望的目標 希望如何?

這可以通過EntityFramework輕鬆完成。你正在尋找的是所謂的「EF遷移」。 EF Migrations會掃描您的POCO類以查看它們是否與您的數據庫匹配。如果有新內容或更改,它會爲您更新數據庫表。要了解如何使用EF遷移檢查此鏈接https://msdn.microsoft.com/en-us/data/jj591621.aspx

連接字符串可以通過Web.Config/App.Config轉換來解析。在發佈期間,Web.Config轉換會自動用生產連接字符串替換開發連接字符串。要查看如何使用web.config轉換,請查看此鏈接http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/web-config-transformations

在發佈期間,可以讓VisualStudio檢查哪些遷移仍未應用於生產數據庫,並自動應用這些遷移。本文http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application展示瞭如何在發佈到Windows Azure時應用遷移。

希望它有幫助!

+0

準確地說,我正在尋找的答案和支持對教程的引用!非常感謝! –

1

在實體框架中,如果您正在使用現有數據庫,則可以在運行時設置連接字符串。

DbContext構造函數允許您通過名稱(取決於應用程序在app.config或web.config文件中)或完整的SQL連接字符串,但包含其他元數據部分來包含連接字符串。

例如,如果你有一個的DbContext定義爲:

public YourModelContainer() : base("name=YourModelContainer") 
{ 
} 

注意,調用基(「NAME = ...」),您可以在您的配置文件指定一個命名實體框架的連接字符串。

要建立一個在運行時,您將創建一個重載的構造函數:

public YourModelContainer(string connectionString) : base(connectionString) 
{ 
    // where connection string includes the metadata section 
    // metadata=res://*/Models.YourModel.csdl|res://*/Models.YourModel.ssdl|res://*/Models.YourModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=YourDatabase;user id=dev;password=p455w0rd;MultipleActiveResultSets=True;App=EntityFramework" 
    // This is just a concatenation of the metadata with a SQL connection string, you can use the EntityConnectionStringBuilder class if you're building this manually at runtime 
} 

看到https://stackoverflow.com/a/26043339/474702

+0

我碰到類似的東西,但這是一個很好的解釋。謝謝! –