7

我有一个使用 Entity Framework Code First 创建的 Web 应用程序。在设置它时,我通过将 DBContext 的完整命名空间和类指定为连接字符串的名称,设法将我的 DB 连接字符串与我的 DBContext 匹配。

<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' 登录失败。

我想知道为什么会这样,因为我似乎在我的连接字符串中指定了用于数据库的安全用户名和密码......那么为什么它试图连接为我的网站正在运行的应用程序池?

另外,我该如何解决这个问题,而不必在 SQL Server 中授予 MyAppPool(或网络服务,如果我将其更改为)DB 权限?

更新:我应该提到我使用以下方法初始化我的 DBContext 类:

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

4 回答 4

4

我发现了这个问题。当我用 初始化我的 DBContext 类时: base("MyDatabase"),它会覆盖 web.config 中指定的连接字符串。

从我的 DBContext 类中删除它,数据库已经存在,该站点现在可以在 IIS 中运行。但是,如果我还没有创建数据库,(或者如果我使用了我的数据库初始化程序,DropCreateDatabaseWhenModelChanges或者DropCreateDatabaseAlways它需要重新创建数据库),初始化程序将失败,因为它会尝试使用 SQL 用户没有创建数据库的权限。

我的解决方法是: base("MyDatabase")最初使用并从 Visual Studio 运行,以便创建数据库。然后将其从代码中删除,将指定的用户添加到 SQL Server 中的数据库安全性,然后它将允许我的站点在 IIS 中运行。

于 2013-03-05T04:43:40.990 回答
3

删除Integrated Security=true;. 这是使当前用户离开的设置。

于 2013-03-04T22:30:14.780 回答
1

使用集成安全性时,数据库会从当前运行进程的用户那里获得一个令牌。您很可能从您的用户帐户运行 Visual Studio,该帐户可能对您的 SQL Server 实例具有管理员权限。

当 IIS 运行您的应用程序时,它使用称为应用程序池(或应用程序池)的东西。您可以在一个池中同时管理多个应用程序。应用程序池还在为该池命名的特殊用户帐户下运行。应用程序池用户存在于名为“IIS AppPool”的容器下,因此 DefaultAppPool 的本地用户是IIS AppPool\DefaultAppPool. 如果您想授予对本地系统上的资源的访问权限(包括文件权限),您还可以将其授予应用程序池用户或本地组IIS_IUSRS以将其授予所有应用程序池。

请记住,这些是本地帐户,因此它们不会跨越网络边界。要在不同的服务器上授予权限,您需要使用域用户(或者更好的是域托管服务帐户),或者您可以将应用程序池用户设置为 NETWORK SERVICE,然后您可以授予权限MyDomain\MyWebServer$(美元标志很重要)。

于 2017-12-27T16:26:32.247 回答
0

您可以使用Web.config 转换使本地连接与远程不同(例如在发布模式下)。要开始使用它,您需要使用Visual Studio中的一键发布来发布您的 Web 应用程序。这是发布 Web 应用程序的非常方便的方式!

看起来这就是你要找的东西。


或根据条件设置连接字符串名称:

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

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

private static bool RunLocally()
{
   // implement some how
}
于 2013-03-05T04:58:25.137 回答