IdentityUserRoles表上使用Identity 2和Entity Framework 6的额外列/字段

时间:2015-06-30 17:15:35

标签: asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity asp.net-identity-2

我正在项目中使用IdentityUser类的自定义实现 问题是实体框架在表 IdentityUserRoles 中添加了一个额外的列,将子类ID映射为约束。
 我知道EF可能会对如何映射这个新类的关系感到困惑,我只是不知道为什么以及如何解决它。我一直在网上搜索这个EF行为,但还没找到解决方案。

以下是一些总结问题的截图:

UsuarioClass DefaultContext DefaultCotextModelCreating UsuarioFuncaoScheme UsuarioMap

3 个答案:

答案 0 :(得分:2)

所以,我已经重新检查了我的数据库映射,我想我找到了解决这个问题的方法:

我的用户类映射位于另一个从EntityTypeConfiguration继承的文件(UsuarioMap)中,然后我会在其构造函数中指定我的配置,就像帖子中的图像一样。 (恕我直言,这对代码组织来说更好)。现在我的IdentityUser(Usuario)表配置它只是位于 OnModelCreating 方法内:

        modelBuilder.Entity<Usuario>().ToTable("Usuario");
        modelBuilder.Entity<Usuario>().Property(u => u.UserName).IsRequired();
        modelBuilder.Entity<Usuario>().Property(u => u.Email).IsRequired();
        modelBuilder.Entity<Usuario>().Property(u => u.PasswordHash).IsRequired();
        modelBuilder.Entity<Usuario>().Property(u => u.Nome).IsRequired();
        modelBuilder.Entity<Usuario>().Property(u => u.DataRegistro).IsRequired();
        modelBuilder.Entity<Usuario>().Property(u => u.UltimoLogin).IsOptional();
        modelBuilder.Entity<Usuario>().HasOptional(u => u.Cliente).WithMany(c => c.Usuarios);

老实说,我不知道为什么实体框架会因为 modelBuilder.Configurations.Add()的参数和 modelBuilder.Entity的返回而以不同的方式看待这两种配置路径) System.Data.Entity.ModelConfiguration.EntityTypeConfiguration 对象,因此逻辑上两种方式都应该有效。

答案 1 :(得分:0)

无法提供完整的技术说明,但我在代码中进行了这些更改以克服此问题:

public class ResultzContext : IdentityDbContext<ApplicationUser>
    {
        public ResultzContext()
            : base("ResultzConnection")
        {

        }


        static ResultzContext()
        {
            // Set the database intializer which is run once during application start
            // This seeds the database with admin user credentials and admin role
            Database.SetInitializer<ResultzContext>(new ApplicationDbInitializer());
        }

        public static ResultzContext Create()
        {
            return new ResultzContext();
        }

: :

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                base.OnModelCreating(modelBuilder);
                //modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).ToTable("AspNetRoles");
//modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers");
                modelBuilder.Entity<ApplicationUser>().ToTable("AspNetUsers");
                //modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).ToTable("AspNetUserLogins");
                //modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }).ToTable("AspNetUserRoles");
                //modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");

因此,通常会注释掉所有内容并从IdentityUser更改为ApplicationUser。但需要补充一点,我原来拥有Identity 1.0的代码 希望它可以帮到你!

答案 2 :(得分:0)

我发现了同样的问题。有一个更简单的解决方案。您应该在IdentityUserRole配置上明确定义关系。

E.g:

public class UserRoleConfiguration : EntityTypeConfiguration<UserRole>
{
    public UserRoleConfiguration()
    {
        HasKey(x => new {x.UserId, x.RoleId});
        HasRequired(x => x.User).WithMany(x => x.Roles).WillCascadeOnDelete();
    }
}