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

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

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

“不支持创建DbModelBuilder或从使用数据库优先或模型优先创建的DbContext编写EDMX。只能从创建的代码优先DbContext获得EDMX,而无需使用现有的DbCompiledModel。”

我还简单地更改了Web配置中的“默认连接”连接字符串,使其指向我的Sql Server,但仍然一无所获。

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

最佳答案

默认情况下,数据库的连接设置将由您在问题中引用的名为“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 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();
...

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

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

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

我在2013年11月的问题Create ASP.NET Identity tables using SQL script中详细介绍了将实体映射到脚本创建的数据库所必需的步骤,您可能会发现这对引用很有用-尽管您应该记住,此后架构随ASP.NET Identity 2的发布而发生了变化。和2.1,我们在1.0中添加的属性现在在2.0及更高版本中成为标准。我们添加的其他属性将根本不会出现。答案将是方法的引用,而不仅仅是复制和粘贴解决方案。

还要记住,虽然可以允许您的主要 Entity Framework 上下文了解ASP.NET标识表,但是在阅读之前,它应该而不是与它们交互。您将遇到这样的问题:您的ASP.NET Identity上下文和主要的Entity Framework数据上下文都正在同时更新或插入到相同的表中,并且在上下文之间没有任何更改跟踪。

希望这可以帮助。

关于asp.net-mvc - 使用SQL Server数据库而不是本地数据库asp.net mvc 5数据库优先的asp.net标识表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127603/

相关文章:

c# - 跨不同 Controller 和 View 重用局部 View (ascx)

c# - Linq 中的左修剪

c# - LINQ 中的条件谓词?

c# - ASP.Net MVC 如何在 ApplicationUser 和我自己的类之间创建一对多关系?

asp.net-identity - asp.net identity 2.2.1 源代码在哪里?

c# - 如何实现邀请码与其他用户共享资源?

c# linq-to-sql EF 查询以匹配特定的 JSON 结构

c# - Linq 表达式中的 Int.Parse

azure - 如何使用 Asp.Net Identity 检查 Azure 表中是否存在记录并返回自定义响应

c# - 下拉更改不调用方法 asp.net mvc jquery