none
Relacion uno a uno entre AspNetUsers y tabla personalizada? RRS feed

  • Pregunta

  • Hola un saludo a la comunidad…

    Estoy teniendo un problema al crear una relación entre la tabla AspNesUsers y una tabla personalizada Usuarios

    La tabla AspNesUsers está en un proyecto web y la tabla Usuarios está en un proyecto tipo librería de clases. Esto es lo que tengo hasta ahora.

     

    En el proyecto librería de clases tengo esto:

     

    contexto

    public class Contexto : IdentityDbContext<ApplicationUsers>
        {
            public Contexto()
                : base("Prueba")
            {
                this.Configuration.LazyLoadingEnabled = false;
                this.Configuration.ProxyCreationEnabled = false;
            }
    
            public DbSet<PermisoPantalla> PermisoPantalla { get; set; }
            public DbSet<Menus> Menus { get; set; }
            public DbSet<Sucursales> Sucursales { get; set; }
            public DbSet<Usuario> Usuario { get; set; }
            public DbSet<Departamento> Departamento { get; set; }
    
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new PermisoPantallaMap());
                modelBuilder.Configurations.Add(new MenusMap());
                modelBuilder.Configurations.Add(new SucursalesMap());
                modelBuilder.Configurations.Add(new UsuarioMap());
                modelBuilder.Configurations.Add(new DepartamentoMap());
                base.OnModelCreating(modelBuilder);
    
                //modelBuilder.Entity<ApplicationUser>().HasMany(x => x.Menus).WithMany().Map(x =>
                //{
                //    x.ToTable("UserMenus");
                //    x.MapLeftKey("UserId");
                //    x.MapRightKey("MenuId");
                //});
            }
            public class DepartamentoMap : EntityTypeConfiguration<Departamento>
            {
                public DepartamentoMap()
                {
                    ToTable("Departamento");
    
                    HasKey(c => c.IdDepartamento);
                    Property(c => c.IdDepartamento).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
                    Property(c => c.NombreDepartamento).IsRequired().HasMaxLength(50);
                    Property(c => c.FechaInsert).HasColumnType("datetime");
                    Property(c => c.FechaUpdate).HasColumnType("datetime");
                    Property(c => c.UsuarioUpdate).HasColumnType("int");
                    Property(c => c.Estatus).IsOptional().HasColumnType("bit");
    
                    HasMany(x => x.User)
                    .WithMany(x => x.Departamentos)
                    .Map(mc =>
                    {
                        mc.MapLeftKey("IdUser");
                        mc.MapRightKey("IdDepartamento");
                        mc.ToTable("DepartamentosXUsuario");
                    });
                }
            }
            public class UsuarioMap : EntityTypeConfiguration<Usuario>
            {
                public UsuarioMap()
                {
                    ToTable("Usuario");
    
                    HasKey(c => c.IdUsuario);
                    Property(c => c.IdUsuario).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                    Property(c => c.CaducaContrasena).HasColumnType("bit");
                    Property(c => c.Direccion).HasMaxLength(250);
                    Property(c => c.EmailExterno).HasMaxLength(250);
                    Property(c => c.Foto).HasMaxLength(250);
                    Property(c => c.Biometrico).HasMaxLength(250);
                    Property(c => c.Foto).HasMaxLength(250);
                    Property(c => c.FechaInsert).HasColumnType("datetime");
                    Property(c => c.FechaUpdate).HasColumnType("datetime");
                    Property(c => c.UsuarioUpdate).HasColumnType("int");
                    Property(c => c.Estatus).IsOptional().HasColumnType("bit");
    
                    //this.HasRequired(c => c.ApplicationUser).WithRequiredPrincipal(e => e.Id);
                    HasRequired(c => c.User).WithRequiredDependent(e => e.Usuario);
                }
            }
            public class SucursalesMap : EntityTypeConfiguration<Sucursales>
            {
                public SucursalesMap()
                {
                    ToTable("Sucursales");
    
                    HasKey(c => c.IdSucursal);
                    Property(c => c.IdSucursal).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
                    Property(c => c.IdTipoSucursal).HasColumnType("int");
                    Property(c => c.IdEmpresa).HasColumnType("int");
                    Property(c => c.IdPais).HasColumnType("int");
                    Property(c => c.IdEstado).HasColumnType("int");
                    Property(c => c.IdMunicipio).HasColumnType("int");
                    Property(c => c.IdLocalidad).HasColumnType("int");
                    Property(c => c.NombreSucursal).IsRequired().HasMaxLength(50);
                    Property(c => c.ResponsableSucursal).HasMaxLength(50);
                    Property(c => c.DireccionSucursal).HasMaxLength(250);
                    Property(c => c.CodigoPostal).HasMaxLength(15);
                    Property(c => c.IP).HasMaxLength(50);
                    Property(c => c.Alias).HasMaxLength(250);
                    Property(c => c.Correo1).HasMaxLength(250);
                    Property(c => c.Correo2).HasMaxLength(250);
                    Property(c => c.FechaInsert).HasColumnType("datetime");
                    Property(c => c.FechaUpdate).HasColumnType("datetime");
                    Property(c => c.UsuarioUpDate).HasColumnType("int");
                    Property(c => c.Estatus).IsOptional().HasColumnType("bit");
    
                    HasMany(x => x.Users)
                    .WithMany(x => x.Sucursales)
                    .Map(mc =>
                    {
                        mc.MapLeftKey("IdUsuario");
                        mc.MapRightKey("IdSucursal");
                        mc.ToTable("SucursalesXUsuario");
                    });
                }
            }
            public class PermisoPantallaMap : EntityTypeConfiguration<PermisoPantalla>
            {
                public PermisoPantallaMap()
                {
                    ToTable("PermisosXPantalla");
    
                    HasKey(c => c.IdPermiso);
                    Property(c => c.IdPermiso).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
                    Property(c => c.Nombre).IsRequired().HasMaxLength(50);
                    Property(c => c.Descripcion).HasMaxLength(53);
                    Property(c => c.UsuarioUpdate).HasColumnType("int");
                    Property(c => c.Status).HasColumnType("int");
                    Property(c => c.Calendarizado).HasColumnType("bit");
                    Property(c => c.Caducado).HasColumnType("datetime");
                    Property(c => c.FechaInsert).HasColumnType("datetime");
                    Property(c => c.FechaUpdate).HasColumnType("datetime");
    
                    HasMany(x => x.Menus)
                    .WithMany(x => x.PermisosPantalla)
                    .Map(mc =>
                    {
                        mc.MapLeftKey("IdPermisoPantalla");
                        mc.MapRightKey("IdMenu");
                        mc.ToTable("PermisoXMenu");
                    });
                }
            }
            public class MenusMap : EntityTypeConfiguration<Menus>
            {
                public MenusMap()
                {
                    ToTable("Menus");
    
                    HasKey(c => c.IdMenu);
                    Property(c => c.IdMenu).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
                    Property(c => c.Name).IsRequired().HasMaxLength(50);
                    //Property(c => c.State).HasMaxLength(50);
                    //Property(c => c.Url).HasMaxLength(50);
                    //Property(c => c.View).HasMaxLength(50);
                    //Property(c => c.Template).HasMaxLength(50);
                    Property(c => c.Controller).HasMaxLength(50);
                    Property(c => c.Icon).HasMaxLength(50);
                    Property(c => c.FechaInsert).HasColumnType("datetime");
                    Property(c => c.FechaUpdate).HasColumnType("datetime");
    
                    HasMany(x => x.Users)
                    .WithMany(x => x.Menus)
                    .Map(mc =>
                    {
                        mc.MapLeftKey("IdUser");
                        mc.MapRightKey("IdMenu");
                        mc.ToTable("MenuXUsuario");
                    });
                }
            }
        }

    la tabla que extiende de IdentityUser

     


    public class ApplicationUsers : IdentityUser
        {
            public ApplicationUsers() : base("Prueba") { }
            public virtual ICollection<Menus> Menus  { get; set; }
            public virtual ICollection<Sucursales> Sucursales { get; set; }
            public virtual ICollection<Departamento> Departamentos { get; set; }
    
            public virtual Usuario Usuario { get; set; }
        }
        public class ApplicationRole : IdentityRole
        {
            public ApplicationRole() : base("Prueba") { }
    
            public virtual ICollection<Menus> Menus { get; set; }
    
        }

    la tabla usuario personalizada esta tabla debe de insertar un registro por cada usuario unsertado

     

     public class Usuario
        {
            //[Key]
            public int IdUsuario { get; set; }
            public bool CaducaContrasena { get; set; }
            public string Direccion { get; set; }
            [EmailAddress]
            [Display(Name = "Email Externo")]
            public string EmailExterno { get; set; }
            public string Foto { get; set; }
            public string Biometrico { get; set; }
            public DateTime FechaInsert { get; set; }
            public DateTime FechaUpdate { get; set; }
            public int UsuarioUpdate { get; set; }
            public bool Estatus { get; set; }
    
            
            public virtual ApplicationUsers User { get; set; }
        }


    En el proyecto web tengo esto:

    la clase identiy model

    public class ApplicationUser :IdentityUser { public string NumeroEmpleado { get; set; } public int IdSucursal { get; set; } public int IdDepartamento { get; set; } public string NombreCompleto { get; set; } public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here userIdentity.AddClaim(new Claim("NumeroEmpleado", this.NumeroEmpleado)); userIdentity.AddClaim(new Claim("IdSucursal", this.IdSucursal.ToString())); userIdentity.AddClaim(new Claim("IdDepartamento", this.IdDepartamento.ToString())); userIdentity.AddClaim(new Claim("NombreCompleto", this.NombreCompleto.ToString())); return userIdentity; } //cuando agrego esta linea me salta el error***************/ public Mymodel Usuario { get; set; }

    ///*********************************************************/

    //public virtual ICollection<Menus> Menus { get; set; } } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("Prueba", throwIfV1Schema: false) { this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false; } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } }

    la clase mymodel

    namespace MapcoErp.Models
    {
        public class Mymodel:Entities.Usuario
        {
        }
    }

    El error


    LOWELLPELIKNO


    error

    lunes, 22 de agosto de 2016 18:38

Respuestas

  • hola

    lo que noto es que defines dos contextos diferentes, por un lado tienes

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

    y por el otro

    public class Contexto : IdentityDbContext<ApplicationUsers>

    tienes que unificarlos en uno solo

    ----

    En el contexto ApplicationDbContext asignas ApplicationUser que define por ejemplo

    public virtual ICollection<Departamento> Departamentos { get; set; }

    pero no le asignas el  DepartamentoMap (lo cual si haces en la clase Contexto)  por eso no sabe como resolver el mapping de las propiedades

    Deberias eliminar el ApplicationDbContext

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta LOWELL_PELIKNO lunes, 29 de agosto de 2016 17:02
    martes, 23 de agosto de 2016 11:20