代码优先迁移 - 子类需要Id字段

时间:2014-05-10 17:07:46

标签: entity-framework ef-code-first asp.net-identity ef-migrations

我在VS 2013中有一个标准的MVC 5项目,并使用内置的身份提供程序。我正在尝试根据http://blogs.msdn.com/b/webdev/archive/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx自定义用户个人资料。

我没有在文章中扩展ApplicationUser,因为我想在同一解决方案中处理另一个项目的扩展。我创建了一个新的子类ExtendedUser:

public class ExtendedUser : IdentityUser
{
    [MaxLength(12)]
    public string PIN { get; set; }
}

然后我有:

public class UsersContext : DbContext
{
    public DbSet<ExtendedUser> ExtendedUsers { get; set; }

    public UsersContext() : base() { }

    public UsersContext(string ConnectionString) : base(ConnectionString) { }
}

当UsersContext被实例化并初始化时,我会遇到:

用户代码未处理System.Data.Entity.ModelConfiguration.ModelValidationException   的HResult = -2146233088   消息=在模型生成期间检测到一个或多个验证错误:

IdentityUserLogin :: EntityType'IdentityUserLogin'没有定义键。定义此EntityType的键。 IdentityUserRole :: EntityType'IdentityUserRole'没有定义键。定义此EntityType的键。 IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'基于没有定义键的类型'IdentityUserLogin'。 IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基于类型'IdentityUserRole',没有定义键。 ....

似乎其他身份成员资格表已更新,但我没有触及其中任何一个。为什么会发生这种情况,我该如何纠正呢。

1 个答案:

答案 0 :(得分:1)

尝试IdentityDbContext<ExtendedUser>作为UsersContext的基类,因为它在您提到的帖子中。如果没有它,你就没有任何代码可以告诉ef哪个属性是关键。如果你不想要IdentityDbContext,你应该在方法void OnModelCreating(DbModelBuilder modelBuilder)中放置属性映射,例如:

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {

       base.OnModelCreating(modelBuilder);
       modelBuilder.Entity<ExtendedUser>().HasKey(t => t.Id);

           ...

   }