【问题标题】:Use SQL Server database instead of local database asp.net mvc 5 database-first asp.net Identity tables使用 SQL Server 数据库而不是本地数据库 asp.net mvc 5 database-first asp.net Identity tables
【发布时间】:2014-08-04 21:10:32
【问题描述】:

我使用 Database First 创建了一个 MVC Web 应用程序。 ASP.Net 身份数据的默认数据库是本地数据库。我需要将其更改为我已经存在的 sql server db。我到处都看过。唯一关于此的文章似乎涉及 Code First 方法。我需要数据库优先方法。我尝试在控制台启用迁移中运行 PM。我最终得到了这个错误:

“不支持从使用 Database First 或 Model First 创建的 DbContext 创建 DbModelBuilder 或编写 EDMX。EDMX 只能从不使用现有 DbCompiledModel 创建的 Code First DbContext 中获取。”

我还简单地将 Web 配置中的“默认连接”连接字符串更改为指向我的 Sql Server,但仍然没有。

谁能指出我在运行我的应用程序而不是本地数据库时如何在 sql server 数据库中创建 asp.net 身份表的正确方向?

【问题讨论】:

  • 创建上下文的代码在哪里?

标签: asp.net-mvc entity-framework asp.net-identity ef-database-first


【解决方案1】:

默认情况下,您的数据库的连接设置将由您在问题中引用的名为“DefaultConnection”的连接字符串确定。

要使用的适当连接字符串的名称实际上可以在ApplicationDbContext类的构造函数中更改,从-

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

到-

public ApplicationDbContext() : base("SomeOtherConnection", throwIfV1Schema: false)
        {
        }

(throwIfV1Schema 属性显然是版本二的新增功能,版本一中不会出现)

但是,如果没有您希望共享/重用的预先存在的连接字符串,只需将“DefaultConnection”连接字符串详细信息更改为另一个数据库(以及具有适当凭据的用户帐户)的详细信息就足够了。

默认情况下,ASP.NET Identity 将在 ASP.NET Identity 上下文第一次尝试与数据库交互时创建表(如果这些表不存在) - 例如尝试注册或登录。如果您只是更改了连接字符串并运行了应用程序,那么它可能没有尝试创建表 - 您需要明确执行与用户相关的操作。

在您的情况下,您想自己创建表。

可以通过覆盖 OnModelCreating 事件来映射 ASP.NET 标识类和属性。这看起来像-

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    var user = modelBuilder.Entity<IdentityUser>().HasKey(u => u.Id).ToTable("User", "Users"); //Specify our our own table names instead of the defaults

    user.Property(iu => iu.Id).HasColumnName("Id");
    user.Property(iu => iu.UserName).HasColumnName("UserName");
    user.Property(iu => iu.Email).HasColumnName("EmailAddress").HasMaxLength(254).IsRequired();
    user.Property(iu => iu.IsConfirmed).HasColumnName("EmailConfirmed");
    user.Property(iu => iu.PasswordHash).HasColumnName("PasswordHash");
    user.Property(iu => iu.SecurityStamp).HasColumnName("SecurityStamp");

    user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
    user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
    user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
    user.Property(u => u.UserName).IsRequired();
...

通过对每个实体使用“ToTable”并为每个属性使用“HasColumnName”,您应该能够映射到您自己的数据库表。

假设您还没有与用户相关的数据库表,您可能希望做的只是在您的数据库创建一个新架构(例如“用户”),映射 ASP。 NET 表来使用它(ToTable 方法有一个接受模式的重载),并让它像往常一样创建表。这样您就可以有理由确信它不会影响您现有的表、存储过程和数据库函数(但一如既往,请先备份)。

您也可以使用 SQL 脚本自己创建表。我发现创建一个新的空 MVC(如果愿意,可以是 Web 窗体)最简单,应用程序下载 sample NuGet project,将 ASP.NET 身份和实体框架包更新到我正在使用的稳定版本,并将其指向空白数据库 - 然后尝试登录。这为您提供了编写自己的脚本所需的所有表和架构信息。

我在 2013 年 11 月的问题 Create ASP.NET Identity tables using SQL script 中详细介绍了将实体映射到脚本创建的数据库所需的步骤,您可能会发现该问题可供参考 - 尽管您应该记住,从那时起架构已经随着ASP.NET Identity 2 和 2.1,以及我们自己在 1.0 中添加的属性现在在 2.0 之后成为标准。我们添加的其他属性根本不会出现。答案将是方法上的参考,而不是简单的复制和粘贴解决方案。

还请记住,虽然您的主要实体框架上下文可以被允许了解 ASP.NET 身份表 - 它应该与他们互动超出阅读.当您的 ASP.NET 标识上下文和主实体框架数据上下文同时更新或插入到同一个表时,您会遇到问题,并且不会跨上下文进行更改跟踪。

希望这会有所帮助。

【讨论】:

  • 好吧,在我深入研究您建议的方法之前,我再次查看了默认连接字符串。我没有正确编写 providerName="System.Data.SqlClient" 部分。这是一个报价问题。我正确地修复了连接字符串,你瞧,这些表是在我的 Sql Server 数据库中创建的。感谢您的深入帮助和建议。我希望这篇文章对某人仍然有用。至于我,这只是一个愚蠢的语法错误。
  • 这是关于如何创建 DB first Identity 表的一个很好的答案 - 由 Identity 团队审核。
  • 很好的回应,但是我要补充一点,如果连接字符串名称与 ApplicationDBContext 类相同,它将自动拾取它而不添加:base("SomeOtherConnection",...跨度>
【解决方案2】:

就我而言,我遇到了连接字符串问题。 我的错是使用了我通过 EDMX 向导创建的连接字符串:

<add name="myEntities" connectionString="metadata=res://*/Models.myModel.csdl|res://*/Models.myModel.ssdl|res://*/Models.myModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=myDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

当我参与相关部分并将DefaultConnection替换为:

<add name="DefaultConnection" connectionString="data source=.\SQLEXPRESS;initial catalog=myDb;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

按照@pwdst 的描述工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2021-11-22
    • 2016-06-20
    • 2021-02-22
    • 2021-08-14
    • 2012-11-04
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多