7

我有一個使用實體框架代碼優先創建的Web應用程序。在設置它的時候,我設法通過指定DBContext的完整命名空間和類作爲連接字符串的名稱,將我的數據庫連接字符串與我的DBContext匹配。實體框架代碼首先忽略連接字符串,使用IIS代替

<add name="MyClassProject.EfDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=true;User Id=MyUsername;Password=MyPassword;" providerName="System.Data.SqlClient"/> 

最初,當我成立了這個項目,我只是在C:\中創建的Inetpub \ wwwroot文件,只是運行它通過Visual Studio。一切正常。

現在我試圖讓代碼生成到一個單獨的網站文件夾,並讓該網站運行,因爲它是在IIS中的自己的網站和應用程序池。我建立了網站和我的主機文件,但是當我去運行它時,我收到以下錯誤。

無法打開登錄所請求的數據庫「MyDatabase」。登錄失敗。

用戶'IIS APPPOOL \ MyAppPool'登錄失敗。

我不知道爲什麼發生這種情況,因爲我似乎在指定安全的用戶名和密碼,我的連接字符串使用了DB ....所以爲什麼它要連接的應用程序池我的網站正在運行?

另外,如何解決這個問題,而不必爲MyAppPool(或網絡服務,如果我改變它)SQL Server中的數據庫權限?

更新:我應該提到,我用我的初始化類的DbContext:

namespace MyClassProject 
{ 
    public class EfDbContext : DbContext 
    { 
     public EfDbContext() : base ("MyDatabase") 
     { 
     } 
    } 
} 

回答

3

刪除Integrated Security=true;。這是將當前用戶關閉的設置。

+0

我已經從連接字符串中刪除了該屬性,但仍然存在相同的問題。我甚至嘗試明確設置Integrated Security = false;但那也沒用。 – 2013-03-05 01:04:17

+1

@SeanHolmesby你確定它使用連接字符串嗎? – 2013-03-05 01:11:36

+0

當我運行Visual Studio(當它運行時)它肯定會將數據添加到我試圖引用的數據庫中。 我有: - 命名空間MyClassProject { 公共類EfDbContext:的DbContext { 公共EfDbContext() :基地( 「MyDatabase的」) {} } } ......而然後...... 2013-03-05 01:17:14

3

我發現了這個問題。 當我使用: base("MyDatabase")初始化我的DBContext類時,它將覆蓋web.config中指定的連接字符串。

從我的DBContext類中刪除該數據庫已存在的數據,該站點現在可以在IIS中工作。 但是,如果我沒有創建數據庫(或者如果我的數據庫初始化程序使用DropCreateDatabaseWhenModelChangesDropCreateDatabaseAlways以便它需要重新創建數據庫),則初始化程序將失敗,因爲它會嘗試使用一個沒有創建數據庫權限的SQL用戶。

我的解決方法是使用: base("MyDatabase")並從Visual Studio開始運行,以便創建數據庫。 然後從代碼中刪除它,將指定的用戶添加到SQL Server中的數據庫安全性中,然後它將允許我的站點在此後在IIS中運行。

+1

'base(「MyDatabase」)'表示來自Web.config的連接字符串名稱。所以你只需要爲不同的部署點使用不同的連接字符串。或者根據條件設置不同的名字。 – abatishchev 2013-03-05 05:00:22

0

您可以使用Web.config Transform以使本地連接與遠程(不同於發佈模式)有所不同。要開始使用它,您需要使用Visual Studio中的One-Click Publish發佈您的Web App。這是發佈網絡應用的非常方便的方式!

看起來這就是你要找的。


或者設置連接字符串名稱基座上的狀態:

public EfDbContext() : base (GetConnectionStringName()) 
{ 
} 

private static GetConnectionStringName() 
{ 
    return RunLocally() : "LocalDatabase" : "RemoteDatabase"; 
} 

private static bool RunLocally() 
{ 
    // implement some how 
} 
1

在使用集成安全性,數據庫被給予從誰是當前正在運行的進程的用戶令牌。很可能,您從您的用戶帳戶運行Visual Studio,該用戶帳戶可能對您的SQL Server實例具有管理權限。

當IIS運行您的應用程序時,它使用一種稱爲應用程序池(或應用程序池)的東西。您可以將一個池中的多個應用程序一起管理。應用程序池也在爲該池命名的特殊用戶帳戶下運行。應用程序池用戶位於名爲「IIS AppPool」的容器下,因此DefaultAppPool的本地用戶爲IIS AppPool\DefaultAppPool。如果您想授予對本地系統資源的訪問權限(包括文件權限),則還可以將其授予應用程序池用戶或本地組IIS_IUSRS,以將其授予所有應用程序池。

請記住,這些是本地帳戶,所以它們不會跨越網絡邊界。要授予其他服務器的權限,您需要使用域用戶(或者更好,域託管服務帳戶),或者您可以將應用程序池用戶設置爲NETWORK SERVICE,然後您可以授予MyDomain\MyWebServer$(美元符號很重要)。