首页 文章

如何在现有数据库中创建ASP.Net Identity表?

提问于
浏览
19

我正在构建我的第一个MVC 5 / Entity Framework应用程序 . 我使用数据库第一种方法从现有的SQL服务器中提取数据 . 现有的SQL数据库从单独的Web表单.net应用程序接收它的数据 .

接下来,新的MVC应用程序和现有的Web表单应用程序将共享数据库 .

我正在使用Identity在MVC应用程序中创建用户帐户 . 所以在这一点上,我的MVC应用程序中有2个数据连接 . 一个用于用户帐户,另一个用于现有SQL服务器 .

这是设置MVC项目的最佳方式吗?继续,我能从Web表单应用程序访问用户数据库吗?

我是新手,我想确保我正确设置 .

3 回答

  • 6

    是否会将用户表添加到现有的sql server中,或者此用户数据库是否为完全独立的数据库?

    您不需要两个数据库 - 您可以在现有数据库中创建标识表 .

    ASP.Net Identity使用 Entity Framework Code First . 因此,在第一次运行应用程序之前,您希望更新与现有数据库相同的连接字符串,该数据库通常位于 ApplicationDbContext 内 .

    enter image description here

    如果您已经有两个单独的数据库并想要合并它们,则需要使用RedGate - SQL Compare和Data Compare等工具 .

    合并两个数据库完全不是原始问题;如果你有问题,请提出另外一个问题 .

  • 0

    在数据库上运行此SQL脚本 .

    /****** Object:  Table [dbo].[AspNetRoles]    Script Date: 15-Mar-17 10:27:06 PM ******/
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    
    CREATE TABLE [dbo].[AspNetRoles](
    
        [Id] [nvarchar](128) NOT NULL,
    
        [Name] [nvarchar](256) NOT NULL,
    
    CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED
    
    (
    
        [Id] ASC
    
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    ) ON [PRIMARY]
    
    
    
    GO
    
    /****** Object:  Table [dbo].[AspNetUserClaims]    Script Date: 15-Mar-17 10:27:06 PM ******/
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    
    CREATE TABLE [dbo].[AspNetUserClaims](
    
        [Id] [int] IDENTITY(1,1) NOT NULL,
    
        [UserId] [nvarchar](128) NOT NULL,
    
        [ClaimType] [nvarchar](max) NULL,
    
        [ClaimValue] [nvarchar](max) NULL,
    
    CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED
    
    (
    
        [Id] ASC
    
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    
    
    GO
    
    /****** Object:  Table [dbo].[AspNetUserLogins]    Script Date: 15-Mar-17 10:27:06 PM ******/
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    
    CREATE TABLE [dbo].[AspNetUserLogins](
    
        [LoginProvider] [nvarchar](128) NOT NULL,
    
        [ProviderKey] [nvarchar](128) NOT NULL,
    
        [UserId] [nvarchar](128) NOT NULL,
    
    CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED
    
    (
    
        [LoginProvider] ASC,
    
        [ProviderKey] ASC,
    
        [UserId] ASC
    
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    ) ON [PRIMARY]
    
    
    
    GO
    
    /****** Object:  Table [dbo].[AspNetUserRoles]    Script Date: 15-Mar-17 10:27:06 PM ******/
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    
    CREATE TABLE [dbo].[AspNetUserRoles](
    
        [UserId] [nvarchar](128) NOT NULL,
    
        [RoleId] [nvarchar](128) NOT NULL,
    
    CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED
    
    (
    
        [UserId] ASC,
    
        [RoleId] ASC
    
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    ) ON [PRIMARY]
    
    
    
    GO
    
    /****** Object:  Table [dbo].[AspNetUsers]    Script Date: 15-Mar-17 10:27:06 PM ******/
    
    SET ANSI_NULLS ON
    
    GO
    
    SET QUOTED_IDENTIFIER ON
    
    GO
    
    CREATE TABLE [dbo].[AspNetUsers](
    
        [Id] [nvarchar](128) NOT NULL,
    
        [Email] [nvarchar](256) NULL,
    
        [EmailConfirmed] [bit] NOT NULL,
    
        [PasswordHash] [nvarchar](max) NULL,
    
        [SecurityStamp] [nvarchar](max) NULL,
    
        [PhoneNumber] [nvarchar](max) NULL,
    
        [PhoneNumberConfirmed] [bit] NOT NULL,
    
        [TwoFactorEnabled] [bit] NOT NULL,
    
        [LockoutEndDateUtc] [datetime] NULL,
    
        [LockoutEnabled] [bit] NOT NULL,
    
        [AccessFailedCount] [int] NOT NULL,
    
        [UserName] [nvarchar](256) NOT NULL,
    
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED
    
    (
    
        [Id] ASC
    
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserClaims]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
    
    REFERENCES [dbo].[AspNetUsers] ([Id])
    
    ON DELETE CASCADE
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserLogins]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
    
    REFERENCES [dbo].[AspNetUsers] ([Id])
    
    ON DELETE CASCADE
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId])
    
    REFERENCES [dbo].[AspNetRoles] ([Id])
    
    ON DELETE CASCADE
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
    
    REFERENCES [dbo].[AspNetUsers] ([Id])
    
    ON DELETE CASCADE
    
    GO
    
    ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]
    
    GO
    
  • 13

    使用DB First,更改连接字符串不会导致Identity 2.0在DB中创建表 .

    CORRECTION: 我最初在身份模式下的数据库中拥有我的身份表,当我使用下面的注册新用户时,新表在dbo模式下写入我的数据库 .

    您必须首先使用Code First创建一个虚拟项目,构建并运行项目,在Web浏览器中转到正在运行的应用程序,使用虚拟电子邮件和密码注册用户,这将导致实体FrameWork Code First(?)在虚拟数据库中创建所有Identity 2.0数据库表 . 然后,您需要将虚拟表导出到SQL脚本并将它们导入到要使用它们的现有数据库中 . 应该有5个表:AspNetUserRoles,AspNetRoles,AspNetUsers,AspNetUserClaims和AspNetUserLogins .

    我有一个ADO.Net实体模型(.edmx文件)用于我的主要数据库模型,并为身份模型创建了另一个.edmx(我命名为:IdentityDbEntities) . 那时您应该从“DefaultConnection”更改连接字符串:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext()
                : base("IdentityDbEntitiesString", throwIfV1Schema: false)
            {
            }
    

    非常重要:在您的Web.config文件中,您必须添加一个您将在上面使用的额外连接字符串 . 看起来(我正在使用SQL Server Dev环境,因此您的连接字符串可能会发生变化):

    <connectionStrings>
        <add name="IdentityDbEntitiesString" 
         connectionString="Data Source=#MyServerAddress#; 
            Initial Catalog=#DbName#; 
            Integrated Security=SSPI;" 
         providerName="System.Data.SqlClient" />
        <add name="IdentityDbEntities" 
         connectionString="metadata=res://*/Models.IdentityModel.csdl|
            res://*/Models.IdentityModel.ssdl|
            res://*/Models.IdentityModel.msl;
         provider=System.Data.SqlClient;
         provider connection string=&quot;
         data source=#MyServerAddress#;
         initial catalog=#DbName#;
         integrated security=True;multipleactiveresultsets=True;
         application name=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" />         </connectionStrings>
    

    DbName#里面的任何内容都会自定义 .

相关问题