Entity framework 实体框架代码首先忽略连接字符串,而使用IIS

Entity framework 实体框架代码首先忽略连接字符串,而使用IIS,entity-framework,entity-framework-4,ef-code-first,connection-string,dbcontext,Entity Framework,Entity Framework 4,Ef Code First,Connection String,Dbcontext,我有一个我首先使用实体框架代码创建的web应用程序。在设置过程中,我通过将DBContext的完整名称空间和类指定为连接字符串的名称,成功地将DB连接字符串与DBContext相匹配 <add name="MyClassProject.EfDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=true;User

我有一个我首先使用实体框架代码创建的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"/>

删除
integratedsecurity=true。这是将当前用户关闭的设置。

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

在数据库已经存在的情况下,将其从我的DBContext类中删除,该站点现在可以在IIS中工作。 但是,如果我还没有创建数据库(或者如果我让我的数据库初始化器在模型更改时使用
DropCreateDatabaseWhenModelChanges
DropCreateDatabaseAlways
以便它需要重新创建数据库),初始化器将失败,因为它将尝试使用没有权限创建数据库的SQL用户

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

您可以使用它使本地连接与远程连接不同(例如在发布模式下)。要开始使用它,您需要使用Visual Studio发布Web应用程序。这是发布web应用程序的非常方便的方法

看起来这就是你要找的


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

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

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

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

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

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


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

我已经从连接字符串中删除了该属性,但仍然存在相同的问题。我甚至尝试过显式设置integratedsecurity=false;但这也不起作用。@SeanHolmesby你确定它使用了那个连接字符串吗?当我运行Visual Studio(当它工作时)时,它肯定会将数据添加到我试图引用的数据库中。我有:-名称空间MyClassProject{public class EfDbContext:DbContext{public EfDbContext():base(“MyDatabase”){}}……然后。。。。。。我的种子数据正在使用CreateDatabaseIfNotExists。。。但是,当我运行VisualStudio时,DB已经存在。然后我进入数据库,将用户添加到数据库的安全性中,并尝试通过IIS运行。
base(“MyDatabase”)
表示Web.config中的连接字符串名称。因此,对于不同的部署点,您只需要有不同的连接字符串。或者根据条件设置不同的名称。
public EfDbContext() : base (GetConnectionStringName())
{
}

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

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