2014-10-06 69 views
2

我使用ASPNET身份2.0和需要:ASP.NET身份 - 如何將dbo.AspNetUsers.Id更改爲非聚集索引?

  • 添加一個名爲ApplicationUserId [INT]聚集索引
  • 更改dbo.AspNetUsers.Id nvarchar的字段從聚集到一個非聚集索引
  • 新領域

在我的模型\ IdentityModel.cs,我說:

public class ApplicationUser: IdentityUser 
    { 
      [Index(IsClustered = true, IsUnique = true)] 
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
      public int ApplicationUserId { get; set; } 
    } 

當然,我知道這將錯誤,因爲我知道,標識目前是一個聚集索引。 如何更改標識以使默認不是隱藏索引?

基本上我想這樣做的原因是我們的DBA不想使用nvarchar(128)(這是AspNetUsers表中的GUID)的外鍵。

還是我只是將其創建爲:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ApplicationUserId { get; set; } 

,然後手動修復索引創建表後?

或者是我唯一的選擇integer keys instead of strings

我提前使用.NET 4.5和安裝了Identity 2.0 Sample Project

Install-Package Microsoft.AspNet.Identity.Samples -Pre 

感謝您的幫助!

+0

據我瞭解SQL服務器不允許PK成爲非聚集索引,所以你必須實行ID int或GUID – trailmax 2014-10-06 21:01:14

回答

0

我得到它的而不轉換GUID [nvarchar的]到[INT]

基本上我更新的模型\ IdentityModel.cs文件

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int ApplicationUserId { get; set; } 

然後我手動更新的工作表(AspNetUserLogins ,AspNetUserClaims和AspNetUserRoles被引用AspNetUsers.Id我仍想保留完好

begin tran 
ALTER TABLE [dbo].[AspNetUserLogins] DROP CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] 
ALTER TABLE [dbo].[AspNetUserClaims] DROP CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] 
ALTER TABLE [dbo].[AspNetUserRoles] DROP CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] 
ALTER TABLE dbo.[AspNetUsers] DROP CONSTRAINT [PK_dbo.AspNetUsers] 
--Uncomment this line in case you need to modify this table again 
--ALTER TABLE dbo.[AspNetUsers] DROP CONSTRAINT [dbo.AspNetUsers_ApplicationUserId] 

-- Add the constraints back, but now nonclustered 
ALTER TABLE dbo.[AspNetUsers] add constraint [PK_dbo.AspNetUsers] primary key  nonclustered 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

-- Add the other constraints back 
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].[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].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) 
REFERENCES [dbo].[AspNetUsers] ([Id]) 
ON DELETE CASCADE 
GO 

-- Add NEW constraint with unique clustered 
ALTER TABLE dbo.[AspNetUsers] add constraint [dbo.AspNetUsers_ApplicationUserId] unique clustered 
(
[ApplicationUserId] 
) 
commit tran 

當你檢查出創建表腳本對於dbo.AspNetUsers,現在看起來就像這樣:

CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](128) NOT NULL, 
    [ApplicationUserId] [int] IDENTITY(1,1) 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 NONCLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 
CONSTRAINT [dbo.AspNetUsers_ApplicationUserId] UNIQUE CLUSTERED 
(
    [ApplicationUserId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]