2012-10-03 34 views
0

我試圖做到這一點在MVC3 Web應用程序使用實體框架5在C#:如何在運行時在C#MVC應用程序中創建SQL Server Express數據庫?

// Local DB connection 
var dbId = String.Format(@"Data Source=.\SQLEXPRESS;AttachDbFilename={0}.mdf;Database=Tests;Integrated Security=True;Pooling=False;Connect Timeout=30;User Instance=True", _dbPath); 
_connection = new SqlConnection(dbId); 

Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); 

// Reset database if the file exists 
var ctx = new MyContext(_connection); 
ctx.Database.CreateIfNotExists(); 
ctx.Database.Initialize(true); 
ctx.SaveChanges(); 

return _connection; 

這工作對我的測試,而不是當我運行的Web應用程序。當我運行的Web應用程序,我得到:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

我的人都建議去除連接字符串的「用戶實例」其他一些問題看,但結果是:

CREATE DATABASE permission denied in database 'master'.

讓我在這裏完全清楚我的目標:我試圖讓Web應用程序按需創建數據庫實例(sqlexpress)。

預先創建數據庫實例不是解決方案。

我很困惑,爲什麼當應用工作者訪問並創建數據庫時需要某種特殊的權限。

你怎麼能做到這一點?

使用sqlite這是一個微不足道的操作,我開始覺得使用實體框架(因此SQL Server Express)是錯誤的,我應該用流利的nhibernate和sqlite來代替。

+0

您是否使用IIS來託管您的MVC應用程序?如果是這樣,應用程序池將使用哪個帳戶。這可能是該帳戶的權限問題。 –

+0

是的。在我本地的IIS副本上,我使用「ASP.NET v4.0」worker;顯然,這並沒有出現在接近生產的地方,因爲它已經壞了,但是我們有一個單獨的工作人員用於產品應用。 – Doug

回答

1

這篇文章http://support.microsoft.com/kb/2002980表明它是「ASP.Net V4.0」應用程序池的默認帳戶「ApplicationPoolIdentity」的文件權限問題,並建議將其更改爲使用「網絡服務」。

+0

不幸的是,似乎沒有幫助。更改爲使用「NetworkService」標識,運行iisreset,但我仍然看到:「CREATE DATABASE權限在數據庫'master'中被拒絕。」 – Doug

+0

我把之前的評論帶回去;重新啓動機器後,這實際上修復了它! iisreset本身是不夠的;也許涉及到重新啓動sql server的一些事情,但是完全重新啓動會修復它。 – Doug

相關問題