使用SQL Server数据库而不是本地数据库asp.net mvc 5数据库优先的asp.net身份表

EB.*_*EB. 6 asp.net-mvc entity-framework ef-database-first asp.net-identity

我使用Database First创建了一个MVC Web App.ASP.Net Identity数据的默认数据库是本地数据库.我需要将其更改为已存在的sql server db.我到处寻找.关于此的唯一文章似乎涉及Code First方法.我需要DB第一种方法.我已尝试在控制台中启用PM - 启用迁移.我最终得到了这个错误:

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

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

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

pwd*_*dst 15

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

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

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
Run Code Online (Sandbox Code Playgroud)

至-

public ApplicationDbContext() : base("SomeOtherConnection", throwIfV1Schema: false)
        {
        }
Run Code Online (Sandbox Code Playgroud)

(throwIfV1Schema属性显然是版本2中的一个补充,并且不会出现在版本1中)

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

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

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

可以通过重写OnModelCreating事件来映射ASP.NET Identity类和属性.这看起来像是 -

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();
...
Run Code Online (Sandbox Code Playgroud)

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

你不妨做,假设你还没有用户相关的数据库表什么,简直就是创建一个新的模式(如"用户")中的数据库,地图的ASP.NET表来使用(该ToTable方法一个接受模式的重载,并让它像往常一样创建表.这样您就可以有理由相信它不会影响您现有的表,存储过程和数据库功能(但总是先备份).

或者,您可以使用SQL脚本自己创建表.我发现最简单的方法是创建一个新的空MVC(如果愿意,可以是Web Forms),应用程序下载示例NuGet项目,将ASP.NET Identity和Entity Framework包更新为我正在使用的稳定版本,并将其指向空白数据库 - 然后尝试登录.这为您提供了编写自己脚本所需的所有表和架构信息.

我详细说明了在2013年11月的问题中将实体映射到脚本创建的数据库所需的步骤使用SQL脚本创建ASP.NET身份表,您可能会发现这对于参考很有用 - 尽管您应该记住,架构自那时起已经更改了ASP.NET身份2和2.1的发布,以及我们自己在1.0中添加的属性现在是2.0以后的标准.我们添加的其他属性根本不会出现.答案将是方法的参考,而不仅仅是复制和粘贴解决方案.

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

希望这可以帮助.

  • 这是如何创建数据库第一个身份表的一个很好的答案 - 由身份团队审核. (3认同)