none
EntityType 'IdentityUserRole' no tiene ninguna clave definida RRS feed

  • Pregunta

  • Hola buenas tardes, tengo un proyecto en MVC5, estpy trabajando con el contexto de datos IdentityDbContext que esta en el IdentityModel, con autentificación de usuario, en el modelo de datos tengo unas tablas que hacen una referencia cruzada.

    Es necesario hacerla:

    la tabla compañias hace referencia a zonas

    la tabla comercios tiene una referencia de compañia y de zona, ahí se hace la referencia cruzada. 

    Se que hay que hay deshabilitar eliminación en cascada. 

    Aplicando esto en el context:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            }

    el tema es que cuando aplico el update-database en el administrador de paquetes nuget después de hacer la migración respectiva me lanza el siguiente error:

    Incidencias.Models.IdentityUserRole: : EntityType 'IdentityUserRole' no tiene ninguna clave definida. Defina la clave para este EntityType.
    Incidencias.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' no tiene ninguna clave definida. Defina la clave para este EntityType.
    IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' se basa en el tipo 'IdentityUserRole' que no tiene claves definidas.
    IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' se basa en el tipo 'IdentityUserLogin' que no tiene claves definidas.

    Mucho agradecería me pudieran ayudar ya que este error no me deja avanzar.

    Saludos cordiales.

    Miguel Lozada.

    

    viernes, 23 de noviembre de 2018 14:29

Respuestas

  • Hola, el código es un ejemplo. Puedes mostrar el código de tu contexto de Identity? También las clases empleadas. Para revisarlas

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta POS Services miércoles, 28 de noviembre de 2018 19:47
    viernes, 23 de noviembre de 2018 18:16
    Moderador

Todas las respuestas

  • Hola. Puedes mostrarnos la definición de la clase Incidencias.Models.IdentityUserRole? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 23 de noviembre de 2018 14:42
    Moderador
  • Hola gracias por responder.

    Yo creo que el problema es que estoy aplicando el método "protected override void OnModelCreating(DbModelBuilder modelBuilder)", en el sitio equivocado

    namespace Microsoft.AspNet.Identity.EntityFramework
    {
        public class IdentityUserRole : IdentityUserRole<string>
        {
            public IdentityUserRole();
        }
    }

    namespace Microsoft.AspNet.Identity.EntityFramework
    {
        public class IdentityUserRole<TKey>
        {
            public IdentityUserRole();

            public virtual TKey RoleId { get; set; }
            public virtual TKey UserId { get; set; }
        }
    }

    viernes, 23 de noviembre de 2018 14:54
  • Ese método debería ser algo parecido a esto

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    
            // Configure Asp Net Identity Tables
            modelBuilder.Entity<User>().ToTable("User");
            modelBuilder.Entity<User>().Property(u => u.PasswordHash).HasMaxLength(500);
            modelBuilder.Entity<User>().Property(u => u.Stamp).HasMaxLength(500);
            modelBuilder.Entity<User>().Property(u => u.PhoneNumber).HasMaxLength(50);
    
            modelBuilder.Entity<Role>().ToTable("Role");
            modelBuilder.Entity<UserRole>().HasKey(r => new {r.UserId, r.RoleId}).ToTable("UserRole");
            modelBuilder.Entity<UserLogin>().HasKey(l => new {l.LoginProvider, l.ProviderKey, l.UserId}).ToTable("UserLogin");
            modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
            modelBuilder.Entity<UserClaim>().Property(u => u.ClaimType).HasMaxLength(150);
            modelBuilder.Entity<UserClaim>().Property(u => u.ClaimValue).HasMaxLength(500);
        }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos





    viernes, 23 de noviembre de 2018 15:52
    Moderador
  • Cambié el método pero:

    No reconoce la clase User

    modelBuilder.Entity<User>().ToTable("User");

    No reconoce la clase Role

    modelBuilder.Entity<Role>().ToTable("Role");


    • Editado POS Services viernes, 23 de noviembre de 2018 16:53
    viernes, 23 de noviembre de 2018 16:37
  • Hola, el código es un ejemplo. Puedes mostrar el código de tu contexto de Identity? También las clases empleadas. Para revisarlas

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta POS Services miércoles, 28 de noviembre de 2018 19:47
    viernes, 23 de noviembre de 2018 18:16
    Moderador
  • Hola te quiero pedir disculpa por ocupar tu tiempo ya que el error que nos ocupa es de omisión, resulta que estaba tratando de hacer una tabla intermedia que no tiene un CRUD por lo tanto no era necesario incluir un controlador, olvide colocar la relación correcta en la tabla compañias de manera que no había maneras de hacer la recursividad correctamente.

    Corregí el error y solucionado el problema.

    Saludos, y muchas gracias por todo.

    Miguel Lozada

    miércoles, 28 de noviembre de 2018 19:52