我有一个使用 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 中作为它自己的网站和应用程序池运行。我已经设置了网站和我的主机文件,但是当我去运行它时,我收到了以下错误。
Cannot open database "MyDatabase" requested by the login. The login failed.
Login failed for user 'IIS APPPOOL\MyAppPool'.
我想知道为什么会发生这种情况,因为我似乎在我的连接字符串中指定了用于数据库的安全用户名和密码....那么为什么它试图作为我的网站运行的应用程序池进行连接?
另外,我该如何解决这个问题,而不必在 SQL Server 中授予 MyAppPool(或网络服务,如果我将其更改为那个)DB 权限?
更新:我应该提到我使用以下方法初始化我的 DBContext 类:
namespace MyClassProject
{
public class EfDbContext : DbContext
{
public EfDbContext() : base ("MyDatabase")
{
}
}
}
最佳答案
我发现了这个问题。
当我用 : base("MyDatabase")
初始化我的 DBContext 类时,它会覆盖 web.config 中指定的连接字符串。
从我的 DBContext 类中删除它,数据库已经存在,该站点现在可以在 IIS 中工作。
但是,如果我还没有创建数据库,(或者如果我的数据库初始化程序使用 DropCreateDatabaseWhenModelChanges
或 DropCreateDatabaseAlways
以便它需要重新创建数据库),初始化程序将失败,因为它会尝试使用无权创建数据库的 SQL 用户。
我的解决方法是使用 : base("MyDatabase")
并最初从 Visual Studio 运行,以便创建数据库。
然后从代码中删除它,将指定的用户添加到 SQL Server 中的数据库安全性,然后它将允许我的站点在 IIS 中运行。
关于entity-framework - Entity Framework 代码优先忽略连接字符串,而是使用 IIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212362/