【问题标题】:Identity can't connect to remote DB, keep connecting to local DB身份无法连接到远程数据库,继续连接到本地数据库
【发布时间】:2019-07-30 12:14:35
【问题描述】:

我正在使用 Identity 框架和 ASP.NET MVC5(数据库优先)。
本地一切正常,但 Identity 无法连接到我托管在 Azure 上的远程数据库。

web.config 中的连接字符串如下所示

<!-- Local DB -->
<add name="MyEntities" 
    connectionString="metadata=res://*/EntityDataModel.csdl|res://*/EntityDataModel.ssdl|res://*/EntityDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MY-PC\SQLEXPRESS;Initial Catalog=MyLocalDBName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" />

<!-- Remote DB -->
<add name="MyEntities" 
     connectionString="metadata=res://*/EntityDataModel.csdl|res://*/EntityDataModel.ssdl|res://*/EntityDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:MyServerName.database.windows.net,1433;initial catalog=MyRemoteDBName;persist security info=False;user id=MyID;password=MyPassword;connect timeout=30;encrypt=True;trustservercertificate=False;application name=EntityFramework;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient"  />

(当我想用远程数据进行调试时,本地DB显然是注释掉的,反之亦然)

奇怪的是 Identity 总是转到 LOCAL 数据库(它甚至会创建一个名为 MyRemoteDBName 的新数据库,但在我第一次启动我的应用程序时会在本地创建)。
但是,Entity Framework 正确地转到远程数据库并显示来自远程数据库的数据!

我的IdentityModels.cs 也有这门课:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("MyLocalDBName", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

我想我错了:public ApplicationDbContext() : base("MyLocalDBName", throwIfV1Schema: false)

我尝试将MyLocalDBName 替换为MyRemoteDBName,但MyRemoteDBName 是在本地创建的(?!)

为什么 Identity 总是去 local DB,而 Entity Framework 却正确地去 remote DB?

编辑

这是我实例化 ApplicationDbContext 的方式:

ApplicationDbContext context = new ApplicationDbContext();

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

【问题讨论】:

  • 您的web.config 是否还有名为MyLocalDBName 的连接字符串。因为我们通常在此代码 public ApplicationDbContext() : base("MyLocalDBName", throwIfV1Schema: false) 的基本构造函数中传递连接字符串名称。
  • 不,我的web.config 只有我在最初的问题中写的 2 个连接字符串。我应该在App.config 或其他地方更改一些内容吗?
  • 您是否首先使用 ADO.NET Entity Framework DB?导致您在问题中编写的连接字符串看起来像这样?
  • 请尝试将public ApplicationDbContext() : base("MyLocalDBName", throwIfV1Schema: false)改为public ApplicationDbContext() : base("MyEntities", throwIfV1Schema: false)
  • 我尝试使用base("MyEntities", ...),但它在我第一次使用身份时引发异常:The entity type IdentityRole is not part of the model for the current context。我正在谷歌搜索这个错误。是的,我首先使用 EF DB

标签: asp.net-mvc asp.net-identity database-connection connection-string identity


【解决方案1】:

您使用的连接字符串用于 EF ADO.NET 模型。身份无法理解。所以你需要为Identity再添加一个连接字符串,如:

<!-- Local DB -->
<add name="IdentityConnection" connectionString="data source=MY-PC\SQLEXPRESS;Initial Catalog=MyLocalDBName;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

<!-- Remote DB -->
<add name="IdentityConnection" 
     connectionString="data source=tcp:MyServerName.database.windows.net,1433;initial catalog=MyRemoteDBName;persist security info=False;user id=MyID;password=MyPassword;connect timeout=30;encrypt=True;trustservercertificate=False;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"  />

并在ApplicationDbContext 上使用它:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("IdentityConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

【讨论】:

  • 在接受您的回答之前我需要进一步调查(我今天下午会这样做)但它似乎正在工作,非常感谢!但是,你能解释一下它以前是如何工作的吗?自从我开始这个项目以来,我只有一个连接字符串,它(本地)运行良好。
  • 它工作正常,因为DbContext 构造函数接受Database 名称或ConnectionString 名称作为参数。如果您在DbContext 构造函数中传递Database 名称,它将查看您的本地数据库服务器以获取数据库。因此,在远程连接的情况下,您需要为其指定一个单独的Connection String
  • 好的,我明白了...非常感谢您的解释和解决方案:-)
猜你喜欢
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2017-08-20
  • 2018-07-24
相关资源
最近更新 更多