而不是默认的5个表,我想只使用UserLoginsTable和UserTable。因为我只有一个"用户"类型(管理员),没有其他表的意义。
我正在使用ASP MVC 5框架和实体框架6(代码优先方法)。
如何在我的应用程序中实现此目的?
当你运行add-migration"ApplicationDbContext"时,它会给你包含所有查询的迁移文件的代码,这里你需要的是编写代码来删除其他4个表,如:
enable-migrations
add-migration "drop tables" //selected specific context
在迁移代码类中写下以下代码
DropTable("dbo.AspNetUserClaims");
DropTable("dbo.AspNetUserLogins");
DropTable("dbo.AspNetUserRoles");
DropTable("dbo.AspNetRoles");
最后运行以下命令
update-database
您可以创建自己的User
继承IdentityUser
,如下所示:
public class User : IdentityUser
{
}
然后你忽略DbContext
中的其他类,包括原始IdentityUser
,包括你的用户DbSet
:
public class MyDbContext : IdentityDbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// avoid some base class sets...
modelBuilder.Ignore<IdentityUser>();
modelBuilder.Ignore<IdentityUserRole>();
modelBuilder.Ignore<IdentityRole>();
modelBuilder.Ignore<IdentityUserClaim>();
// keep identity's original configurations for AspNetUsers and AspNetUserLogins
EntityTypeConfiguration<User> configuration = modelBuilder.Entity<User>().ToTable("AspNetUsers");
configuration.HasMany<IdentityUserLogin>(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
IndexAttribute indexAttribute = new IndexAttribute("UserNameIndex")
{
IsUnique = true
};
configuration.Property((Expression<Func<User, string>>)(u => u.UserName)).IsRequired().HasMaxLength(0x100).HasColumnAnnotation("Index", new IndexAnnotation(indexAttribute));
configuration.Property((Expression<Func<User, string>>)(u => u.Email)).HasMaxLength(0x100);
modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { LoginProvider = l.LoginProvider, ProviderKey = l.ProviderKey, UserId = l.UserId }).ToTable("AspNetUserLogins");
}
}
我之所以忽略原始IdentityUser
并创建自己的User
,是因为这个异常:
导航属性"角色"不是类型上的声明属性 "身份用户"。验证它是否未被显式排除 模型,并且它是有效的导航属性。
我尝试使用modelBuilder.Entity<IdentityUser>().Ignore(u => u.Roles);
但没有解决,但如果有人知道如何解决这个问题,我们可以让事情变得更简单,我将不胜感激任何建议。