使用SQL Server数据库代替本地数据库asp.net mvc 5数据库优先asp.net标识表



我已经创建了一个MVC Web应用程序使用数据库第一。默认的数据库为ASP。Net Identity数据是一个本地数据库。我需要改变这到我的sql server db已经存在。我到处都找过了。关于这一点的唯一文章似乎都是关于代码优先的方法。我需要DB第一方法。我已经尝试在控制台启用迁移中运行PM。我最终得到这个错误:

"不支持创建DbModelBuilder或从使用数据库优先或模型优先创建的DbContext中写入EDMX。EDMX只能从不使用现有DbCompiledModel而创建的Code First DbContext中获得。"

我也简单地改变了"默认连接"连接字符串在我的web配置指向我的Sql Server,仍然没有。

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

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

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

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

-

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

(throwIfV1Schema属性显然是在版本2中添加的,在版本1中不会出现)

然而,在没有希望共享/重用的预先存在的连接字符串的情况下,简单地将"DefaultConnection"连接字符串的详细信息更改为另一个数据库(以及具有适当凭据的用户帐户)的连接字符串的详细信息通常就足够了。

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

在您的示例中,您希望自己创建表。

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

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",你应该能够映射到你自己的数据库表。

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

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

我在2013年11月的问题Create ASP中详细介绍了将实体映射到脚本创建的数据库所需的步骤。. NET标识表使用SQL脚本,你可能会发现有用的参考-尽管你应该记住,模式已经改变了,因为ASP. NET发布。. NET Identity 2和2.1,以及我们在1.0中自己添加的属性,现在都是2.0以后的标准。我们添加的其他属性根本不会出现。答案将是一个方法参考,而不是简单的复制和粘贴解决方案。

还请记住,虽然您的主实体框架上下文可以被允许了解ASP。. NET标识表——它应该而不是在读取之外与它们交互。您将遇到的问题是,您的ASP。. NET Identity上下文和主实体框架数据上下文同时更新或插入到相同的表中,并且不会有跨上下文的更改跟踪。

在我的情况下,我遇到了连接字符串问题。我的错误是使用了我通过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" />

相关内容

  • 没有找到相关文章

最新更新