实体框架SqlException:无法打开数据库""登录请求。用户登录失败'域\用户ID”

时间:2017-11-30 21:08:55

标签: c# sql-server entity-framework

实体框架代码优先部署到公司SQL Server问题。

我有一个使用EF的ASP.NET MVVM应用程序。它在我的开发笔记本电脑上完美运行但是,当我将数据库移动到SQL Server公司时,我遇到了问题。

我在web.config中使用的连接字符串是

<add name="ApplicationInventoryContext" 
     connectionString="Data Source=COMPANY_SQLSERVER; Initial Catalog=ApplicationInventory; Integrated Security=True;Connect Timeout=15;" 
     providerName="System.Data.SqlClient" />

连接字符串应该没问题,因为我可以使用以下连接来连接和查询数据库:

  • Visual Studio SQL Server资源管理器
  • Microsoft SQL Server Management Studio

这是我的DbContext

public class ApplicationInventoryContext:DbContext
{
     public DbSet<Application> Applications { get; set; }

     public ApplicationInventoryContext() : 
         base("name=ApplicationInventoryContext")
     {
         Database.SetInitializer<ApplicationInventoryContext>(null);
     }
 }

这是我查询数据库的存储库:

public class DisconnectedRepository
{
     public List<Application> GetApplicationsList()
     {
         using (var context = new ApplicationInventoryContext())
         {
            return context.Applications.AsNoTracking().ToList();
         }
     }
     .....................
}

当我运行应用程序时,我收到以下错误:

  

Entity Framework Exception SqlException: Cannot open database requested by the login
  SqlException:无法打开登录请求的数据库   用户登录失败&#39;域\用户ID”

如果错误显示我在上面的两个连接中使用的相同登录信息,那么怎么会发生这种情况?

2 个答案:

答案 0 :(得分:3)

您的连接字符串指定Integrated Security=True。这意味着它正在尝试使用运行应用程序的进程的标识来访问数据库。因为它是一个Web应用程序,您可能在本地使用IISExpress,这意味着它作为登录用户(即您)的身份运行。您是否有权使用用于登录计算机的凭据登录公司SQL服务器?如果没有,那就是你的问题。

对我来说似乎不寻常的是,您正试图从开发计算机上攻击企业SQL Server。大多数组织不允许开发人员访问生产,因此很难判断您是否违反了策略,试图做您正在做的事情,或者在您的环境中这是否正常。

这里有两个选项:

  1. 为您的域帐户登录公司SQL Server。这不是一个特别好的选择,因为如果你不是唯一的开发人员,那么每个开发人员都需要做同样的事情。

  2. 创建SQL Server登录并更改连接字符串以使用UserId和Password而不是集成安全性。这仍然不是一个很好的选择,因为现在每个开发人员都会知道公司SQL Server的登录凭据。

答案 1 :(得分:0)

由于Steve,我将发布我找到的解决方案。我发现的回复就在这里 stackoverflow.com/questions/4805094/

所以我所做的只是修改DBContext的构造函数,如下所示:

&GT;

  

public class ApplicationInventoryContext:DbContext    {       public DbSet Applications {get;组; }

public ApplicationInventoryContext() : 
                                     base("Data Source=COMPANY_SQLSERVER;                                           >                                          Initial Catalog=ApplicationInventory; 
                                      Integrated Security=True;      
                                       Connect >Timeout=15;")
{
    Database.SetInitializer<ApplicationInventoryContext>(null);
}
     

}

现在它运作得很好。 请查看以上链接,您可以在其中找到其他方法