【问题标题】:How to create ASP.net identity tables in an already created database using code first?如何首先使用代码在已创建的数据库中创建 ASP.net 身份表?
【发布时间】:2017-09-13 12:58:31
【问题描述】:

我的应用程序已经开发了大约一个月。我现在决定使用 ASP.NET Identity。我已经有了身份的视图模型,但需要创建表。我在想,如果我有视图模型,我不确定为什么我还没有表格?我已经使用自己的自定义上下文在初始化程序中删除了创建,我只需要知道如何让 EF 为用户和角色构建包含的身份表?我环顾四周,发布的答案似乎都不是我需要的?

【问题讨论】:

标签: c# asp.net entity-framework asp.net-identity


【解决方案1】:

在您的数据库上运行此 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

【讨论】:

  • 这个支持什么版本?你从哪里得到的?
  • 此脚本适用于旧的 MVC。我是从具有身份验证的新 Web 应用程序创建的数据库中获取的。
  • 我认为要求自动化方式。还有什么代码改变了,你的 sql 将是相同的和旧版本
【解决方案2】:

所以在阅读了一些摆弄之后,我得到了答案。我所要做的就是最终从 ASP.NET Identity 运行 register 方法并创建所有表。

【讨论】:

  • 这个注册方法是什么?它在帐户控制器上吗?
  • 注意:根据您的设置,表可能会在本地数据库文件中创建。
  • 我遇到了同样的问题,但我不确定我是否理解您的解决方案
  • 我试图注册一个通过帐户控制器的注册方法运行的用户,我的应用程序注意到数据库结构不存在并为我播种。我想这就是 LeRainman 所指的
【解决方案3】:

如果您不想启用迁移,也许只需针对数据库运行 ASP.NET Identity Sql 脚本:

https://www.codeproject.com/Tips/677279/SQL-script-for-creating-an-ASP-NET-Identity-Databa

【讨论】:

    【解决方案4】:

    考虑迁移

    如果适用,您需要考虑构建一个migration,这将允许您生成(并可能执行)必要的脚本以在您的数据库中创建适当的表或更改。

    默认情况下,您应该有某种类型的 ApplicationDbContext 类,如下所示,将用于定义您的“安全相关”数据库:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", false)
        {
        }
    
        // Other code omitted for brevity
    }
    

    然后您只需在包管理器控制台中运行 Enable-Migrations 命令:

    Enable-Migrations
    

    这应该会在您的应用程序中生成一个 Migrations 文件夹,其中包含控制如何执行迁移的各种配置文件以及 InitialCreate 迁移。这可能仅在您以前在应用程序中有一些与 Code-First 相关的代码时才会出现,如果没有,请不要担心。然后,您可以尝试运行 Update-Database 命令,该命令应该对您的数据库执行任何迁移(包括初始迁移):

    Update-Database
    

    更新数据库后,您可以继续对模型进行更改,只需通过 Add-Migration 命令和之前的 Update-Database 命令创建和执行新迁移:

    Add-Migration "AddedAnotherPropertyToFoo"
    Update-Database
    

    【讨论】:

    • 我确实知道迁移,我只是想找到一种方法来在没有迁移的情况下创建表。如果数据库已经创建,这是不可能的吗?
    • 您可以在this blog post 中找到脚本,您可以使用这些脚本生成必要的身份相关表,而无需使用迁移。这篇文章本质上只是自动生成表格,然后作者编写出您可以自己执行的每一个(例如用户、角色等)。
    • 强调从 IdentityDbContext 继承。这是在迁移期间显示身份表所必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2013-02-16
    • 2018-09-18
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多