我已经使用数据库优先创建了一个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/