繁体   English   中英

将Aspnet Identity 2添加到Code First EF模​​型中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM