无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体

Posted

技术标签:

【中文标题】无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体【英文标题】:Cannot migrate AspNetUser entity in Entity Framework Code First Approach in .NET 【发布时间】:2016-09-05 23:59:12 【问题描述】:

我正在使用 Visual Studio 2013 开发一个 ASP.NET MVC 项目。我正在使用实体框架代码优先方法与数据库进行交互。但是由于 ASP.NET 中的内置身份系统,我在迁移数据时遇到了问题。在我接触身份系统之前一切都很好。

这些是我已经完成的步骤。

    我使用内置身份系统从 UI 注册了一个帐户。所以在数据库中创建了 AspNetUsers 表。

    我为我的代码创建了 AspNetUser 类,因为我需要使用它。

    然后我运行迁移和更新数据库命令。它会引发错误。

这是我的 AspNetUser 类

public class AspNetUser
    
        [Required]
        public String Id  get; set; 
        [Required]
        public String UserName  get; set; 
        public String PasswordHash  get; set; 
        public String SecurityStamp  get; set; 
        [Required]
        public String Discriminator  get; set; 
    

这是我的数据库上下文类

public class AyarDbContext : DbContext
    
        public AyarDbContext()
            : base("DefaultConnection")
        

        

        public DbSet<Category> Categories  get; set; 
        public DbSet<Region> Regions  get; set; 
        public DbSet<Area> Areas  get; set; 
        public DbSet<Item> Items  get; set; 
        public DbSet<ItemContactInfo> ItemContacts  get; set; 
        public DbSet<Gallery> Galleries  get; set; 
        public DbSet<Mail> Mails  get; set; 
        public DbSet<AspNetUser> AspNetUsers  get; set; 

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        

        
    

这是我得到的错误。

数据库中已经有一个名为“AspNetUsers”的对象。

如何迁移 AspNetUser 类?我使用 UI 注册,因为我自动创建身份系统所需的其他表。如何迁移该类并使用数据库中已存在的 AspNetUsers 表进行映射。

【问题讨论】:

【参考方案1】:

正如错误所解释的,该表已经存在并且可以通过这种方式访问​​:

var user = context.Users.First(u => u.Id == myId);

如果你想扩展用户类并添加属性,你可以继承它:

public class MyAppUser : IdentityUser

    // don't include properties already in IdentityUser
    public string MyNewProperty  get; set; 

http://johnatten.com/2014/06/22/asp-net-identity-2-0-customizing-users-and-roles/

【讨论】:

也许,我可以在代码中访问用户。如果我将来必须再次更新我的模型怎么办?这个错误会再次出现在我身上。 是的,您可以使用如上所示的代码或使用用户管理器访问用户表。取决于你想要做什么。如果您只想添加其他属性,请继承并添加属性。如果您想重做密码散列或内部工作,这是一项重大的工作 (IMO) 不,在这种情况下,我无法使用迁移添加新实体,因为 AspNetUser 包含在迁移类文件中。 您不需要 AspNetUser 类。删除它和 DbSet。该表由 Identity 基类处理。明确您的需求。

以上是关于无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体的主要内容,如果未能解决你的问题,请参考以下文章

独立于模式的实体框架代码优先迁移

调试代码优先的实体框架迁移代码

如何为实体框架代码优先迁移设置隔离级别

实体框架代码优先迁移 - 我可以针对以前的迁移

使用实体框架在代码优先迁移中有条件地插入数据

实体框架 - 迁移 - 代码优先 - 每次迁移播种