【问题标题】:Code first migration - sub-class requires Id field代码优先迁移 - 子类需要 Id 字段
【发布时间】:2014-06-28 08:06:58
【问题描述】:

我在 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) { }
}

当用户上下文被实例化和初始化时,我遇到了:

System.Data.Entity.ModelConfiguration.ModelValidationException 未被用户代码处理 H结果=-2146233088 Message=在模型生成期间检测到一个或多个验证错误:

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

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

【问题讨论】:

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


    【解决方案1】:

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

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
    
           base.OnModelCreating(modelBuilder);
           modelBuilder.Entity<ExtendedUser>().HasKey(t => t.Id);
    
               ...
    
       }
    

    【讨论】:

    • 我把它改成了public class UsersContext : IdentityDbContext&lt;ExtendedUser&gt;。现在,当实例化 UsersContext 时,会发生 InvalidOperationException:不支持每种类型的多个对象集。对象集“ExtendedUsers”和“Users”都可以包含“ExtendedUser”类型的实例。我不明白关于“用户”的部分
    • msdn - IdentityDbContext 你可以找到IdentityDbContext&lt;ExtendedUser&gt; 会给你财产:public virtual IDbSet&lt;ExtendedUser&gt; Users { get; set; }。因此,使用您的 public DbSet&lt;ExtendedUser&gt; ExtendedUsers { get; set; },您将拥有 IDbSetUsersContext 2 个属性 - 因此您应该删除您的 ExtendedUsers 并使用 Users。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2016-05-26
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多