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$(美元符号很重要)。