修改 ASP.NET Identity 預設的 Table Name

摘要:修改 ASP.NET Identity 預設的 Table Name

測試環境: VS2013、MV5、Windows7

 


 

之前的幾篇有關 ASP.NET Identity 貼文中已經很清楚的了解如何新加入額外的欄位在Users Table 中,今天要來測試的是有沒有辦法由我們自行決定那些 ASP.NET Identity 架構所產生的Tables 的 Table Name呢?也許在您的應用程式中有某些特別的原因必須自行控制資料庫中Table 的名稱,包含由 ASP.NET Identity 所自動產生的系統 Tables,本文就來看看要如何達到這要的需求!


 

貼文內容:

  • 建立MVC5新專案並執行

  • 修改Tables Name

  • 啟動 Migration 功能

  • 更新資料庫

  • 執行結果

 

 


 

 

建立MVC5新專案

 

一樣透過VS2013 範本建立新專案, "檔案"=>"新增"=>”專案",選擇 Web 範本中的 “ASP.NET Web應用程式,按確定鍵後,於”新增ASP.NET專案”

視窗中點選"MVP”範本,並確定驗證方式是"個別使用者帳號"。完成專案建立後當您啟動系統,第一次登入時會自動ASP.NET Identity 所使用的那五個Tables(如下圖)



(請特別注意 ASPNetUsers中的第一個欄位名稱為Id)



 

修改Table Name

 

在AspNet.Identity抽象架構中二個主要的觀念就是 users 和 stores。 users 指的是系統中使用者的相關資訊,而stores 則是將使用者帳戶資訊儲存至資料來源(data source)中及由資料來源(data source)讀取出來。在ASP.NET Identity架構下最主要的二個組件(Assembly)是 Microsoft.AspNet.Identity.Core 及 Microsoft.AspNet.Identity.EntityFramework,這二個組件的主要功能正好就是對映到前述的二個觀念中。

 

在Identity.Core中有二個主要的 class : UserManager 及 RoleManager,其中UserManager可以說是最重要的,它是被使用來建立、搜尋/取得、移除:

  • Users

  • Passwords

  • Claims

  • Link to roles

  • Link to logins


而在 Microsoft.AspNet.Identity.EntityFramework的UserStore則負責將由UserManager所產生的使用者帳戶物件寫入至資料來源/由資料來源讀取出來。

 

由前述的說明中可以知道要想要達成的"資料表(table name )更名"需求可以從Microsoft.AspNet.Identity.EntityFramework中IdentityDbContext的 OnModelCreating() 來動手腳。


首先用 Dot Net Reflector 打開Microsoft.AspNet.Identity.EntityFramework,找到 IdentityDbContext class,檢視一下 OnModelCreating() 就會發現由系統自動產生的的預設Table Name就在這段程式中,同時注意到它是可覆寫的。


接下來要開始改寫的工作,先找到 “Models”目錄下的”IdentityModels.cs” 中的 ApplicationDbContext class (如下圖)


在這個class 中去覆寫 OnModelCreating() method


完整程式如下:

 

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.EntityFramework;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.ComponentModel.DataAnnotations;

using System.Data.Entity;

using System.Linq.Expressions;


namespace ToDoProject.Models

{

   // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.

   public class ApplicationUser : IdentityUser

   {

       [Display(Name="所在城市")]

       public string HomeTown { get; set; }

       public DateTime? BirthDate { get; set; }

       public virtual ICollection<ToDo> ToDoes { get; set; }

   }


   public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

   {

       public ApplicationDbContext()

           : base("DefaultConnection")

       {

       }


       public DbSet<ToDo> ToDoes { get; set; }


       protected override void OnModelCreating(DbModelBuilder modelBuilder)

       {

           modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");

           modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property((Expression<Func<ApplicationUser, string>>)(u => u.UserName)).IsRequired();

           modelBuilder.Entity<ApplicationUser>().HasMany<IdentityUserRole>(u => u.Roles);

           modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { UserId = r.UserId, RoleId = r.RoleId }).ToTable("MyUserRoles");

           modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { UserId = l.UserId, LoginProvider = l.LoginProvider, ProviderKey = l.ProviderKey }).ToTable("MyUserLogins").HasRequired<IdentityUser>(u => u.User);

           modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims").HasRequired<IdentityUser>(u => u.User);

           modelBuilder.Entity<IdentityRole>().ToTable("MyRoles").Property((Expression<Func<IdentityRole, string>>)(r => r.Name)).IsRequired();

       }

   }

}


 

啟動 Migration功能


 

更新資料庫





 

更新資料庫成功後,透過伺服器總管,可以看到系統所產生的Table Name 已經都變成我們自行定義的名稱了,甚至連 Users Table 中的 Primary Key都由預設的ID改變成 UserId了。



 

 

參考文章:

http://www.novanet.no/blog/olav-nybo/dates/2013/11/aspnet-identity-10-release-version/

http://stackoverflow.com/questions/19460386/how-can-i-change-the-table-names-when-using-visual-studio-2013-aspnet-identity