2014-04-04 39 views
41

我已經使用了多年的ASP.net會員資格,並且剛開始嘗試使用ASP.net身份。他們剛剛發佈了2.0版本,並且應該支持int主鍵。我定義我的自定義身份類如爲了得到整數主鍵的支持如下:如何使用int ID列更改ASP.net Identity 2.0的表名?

public class User : IdentityUser<int, UserLogin, UserRole, UserClaim> 
{ 
} 

public class UserLogin : IdentityUserLogin<int> 
{ 
} 

public class Role : IdentityRole<int, UserRole> 
{ 
    public string Description { get; set; } // Custom description field on roles 
} 

public class UserRole : IdentityUserRole<int> 
{ 
} 

public class UserClaim : IdentityUserClaim<int> 
{ 
} 

public class MyDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim> 
{ 
    public MyDbContext() : this("MyDB") { } 

    public MyDbContext(string connStringName) : base(connStringName) 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<User>().ToTable("Users"); 
     modelBuilder.Entity<Role>().ToTable("Roles"); 
     modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
     modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
     modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

當我創建一個數據庫遷移,它正確地創建爲每個標識表的整數ID列,但是,忽略了OnModelCreating方法中指定的自定義表名。相反,我得到的表名如dbo.AspNetUsersdbo.AspNetRoles

我也嘗試將[Table("TableName")]添加到我的自定義標識類中,但它沒有任何作用。

在尋找的ASP.net身份1.0的例子,它看起來像他們使用基本身份類重複每個modelBuilder.Entry<Type>().ToTable("TableName")行:

modelBuilder.Entity<User>().ToTable("Users"); 
modelBuilder.Entity<IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>, IdentityUserClaim<int>>>().ToTable("Users"); 

modelBuilder.Entity<Role>().ToTable("Roles"); 
modelBuilder.Entity<IdentityRole<int, UserRole>>().ToTable("Roles"); 

modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles"); 

modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins"); 

modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 
modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims"); 

不過,我試了幾個變化,我的遷移不會產生。我一直收到類似於的錯誤,類型爲Microsoft.AspNet.Identity.EntityFramework.IdentityUser'4 [System.Int32,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin'1 [System.Int32],Microsoft.AspNet.Identity.EntityFramework。 IdentityUserRole'1 [System.Int32],Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim'1 [System.Int32]]'未映射。使用Ignore方法或NotMappedAttribute數據註釋檢查類型是否未被明確排除。驗證類型是否定義爲一個類,不是原始的或通用的,並且不從EntityObject繼承。

如何在ASP.net Identity 2.0中使用整數主鍵生成自定義表名?

+0

上市,如果你碰巧在這裏降落在尋找我的名字牙齒3.0,[檢查這個Q/A](http://stackoverflow.com/questions/34523066/how-can-i-change-the-table-names-used-by-asp-net-identity-3- vnext)。 + 1s all – Terminus

回答

73

Grrr ......因此,在浪費了幾個小時後,我複製了我的規則並將它們粘貼到base.OnModelCreating(modelBuilder);以下,並且所有內容都正常工作。我沒有意識到所需要的基礎方法被稱爲第一:(

一切正常,現在使用以下配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); // This needs to go before the other rules! 

    modelBuilder.Entity<User>().ToTable("Users"); 
    modelBuilder.Entity<Role>().ToTable("Roles"); 
    modelBuilder.Entity<UserRole>().ToTable("UserRoles"); 
    modelBuilder.Entity<UserLogin>().ToTable("UserLogins"); 
    modelBuilder.Entity<UserClaim>().ToTable("UserClaims"); 
} 
+0

興趣點 - base.OnModelCreating(modelBuilder);爲我工作以及.. :) –

+1

一個職位的救生員,需要先調用基礎imp先不直觀。如果使用Identity 2.0,模型類型是IdentityRole,IdentityUser,IdentityUseRole等等,但是同樣的主體適用。 –

+0

非常感謝!你是如何找出base.OnModelCreating不得不先打電話? –

7

在IdentityModel.cs文件,添加以下代碼在ApplicationDbContext

公告的型號名稱不同的是,在接受的答案

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<ApplicationUser>().ToTable("SystemUsers"); 
     modelBuilder.Entity<IdentityRole>().ToTable("SystemRoles"); 
     modelBuilder.Entity<IdentityUserRole>().ToTable("SystemUserRoles"); 
     modelBuilder.Entity<IdentityUserLogin>().ToTable("SystemUserLogins"); 
     modelBuilder.Entity<IdentityUserClaim>().ToTable("SystemUserClaims"); 
    } 
+0

是否有可能改變這個永久的事件,改變下面的代碼也應該保持它不變 – SAR

相關問題