[英]Adding Aspnet Identity 2 to Code First EF model
我正在使用“代码优先”方法使用实体框架。 我创建了一个MVC应用程序并进行了“注册”,它生成了所有的AspNet表。
我想要一个AspNetUsers
模型,以便我的其他模型之一可以引用它。 我尝试添加如下所示的映射,但仍在获取There is already an object named 'AspNetUsers' in the database.
错误。
AspNetUser.cs
public class AspNetUser
{
public string Id { get; set; }
public string Email { get; set; }
public bool EmailConfirmed { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
public string PhoneNumber { get; set; }
public bool PhoneNumberConfirmed { get; set; }
public bool TwoFactorEnabled { get; set; }
public DateTime? LockoutEndDateUtc { get; set; }
public bool LockoutEnabled { get; set; }
public int AccessFailedCount { get; set; }
public string UserName { get; set; }
}
制图
public class AspNetUserMap : EntityTypeConfiguration<AspNetUser>
{
public AspNetUserMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Id)
.IsRequired()
.HasMaxLength(128);
this.Property(t => t.Email)
.HasMaxLength(256);
this.Property(t => t.UserName)
.IsRequired()
.HasMaxLength(256);
// Table & Column Mappings
this.ToTable("AspNetUsers");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Email).HasColumnName("Email");
this.Property(t => t.EmailConfirmed).HasColumnName("EmailConfirmed");
this.Property(t => t.PasswordHash).HasColumnName("PasswordHash");
this.Property(t => t.SecurityStamp).HasColumnName("SecurityStamp");
this.Property(t => t.PhoneNumber).HasColumnName("PhoneNumber");
this.Property(t => t.PhoneNumberConfirmed).HasColumnName("PhoneNumberConfirmed");
this.Property(t => t.TwoFactorEnabled).HasColumnName("TwoFactorEnabled");
this.Property(t => t.LockoutEndDateUtc).HasColumnName("LockoutEndDateUtc");
this.Property(t => t.LockoutEnabled).HasColumnName("LockoutEnabled");
this.Property(t => t.AccessFailedCount).HasColumnName("AccessFailedCount");
this.Property(t => t.UserName).HasColumnName("UserName");
}
}
DbContext
public class MovieContext : DbContext
{
public MovieContext() : base("DatabaseName")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MovieContext, Migrations.Configuration>("DatabaseName"));
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Log> Logs { get; set; }
public DbSet<AspNetUser> Users { get; set; }
public DbSet<Tracking> Tracking { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AspNetUserMap());
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
更新:
我想我以错误的方式提出了这个问题。
基本上我该怎么做:
public class Tracking
{
public int TrackingId { get; set; }
public Guid UserId { get; set; } <--This needs to be the ID in the AspNetUsers table
public ICollection<Movie> MovieId { get; set; }
}
首先使用代码为身份实体定制模式还没有成功。 我结束了修改迁移代码EF产生的,而是和公正,确保不跑add-migration Initial -force
没有做仔细的合并。 这也使我可以将聚集索引更改为datetime2
列, 从而避免了将聚集索引保留在guid上的可怕性能问题 。
编辑:如果您尝试更改用户实体的主键类型,则需要使用键选择(在本例中为Guid)扩展IdentityUser类型,然后需要扩展其余的通用实体也为用户键入Guid键。 关于这一点,有一篇很棒的文章 -他使用整数,但是将相同的模式用于guid键。
或者,您可以在将字符串Id解析为guid的用户实体上公开计算属性,因为这是
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.