2014-04-04 38 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

相关问题