none
Relacionar la tabla aspnetuser con una tabla de mi base de datos RRS feed

  • Pregunta

  • Buenas noches,

    Estoy empezando con el mvc5 y veo que ya no usa el simplemembership del mvc4, usa el sistema Identity, He creado las tablas del Identity en mi propia BD,  lo que quisiera es relacionar la tabla aspnetuser del Identity con mi tabla Post, de forma que un usuario pueda crear muchos post en mi blog. Estoy usando CodeFirst, he visto como personalizar  la tabla aspnetuser, le aumenté los campos Firstname y LastName, pero no tengo idea de como relacionar esa tabla con mi tabla Post.

    Aqui les dejo el diagrama que tengo

    Ahí en rojo esta la relación que quisiera crear.

    Aqui esta el codefirst de mi clase Post

    [Table("Post")] public class Post { [Key,DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)] public int PostId { get; set; } public string Titulo { get; set; } public string Detalle { get; set; } //Propiedades de navegacion public virtual Blog Blog { get; set; }

     public virtual ApplicationUser Usuario { get; set; }

    }

    Aqui el codigo de la clase ApplicationUser que viene con el mvc5, ahi pueden ver que añadí dos campos FirstName y LastName y traté de relacionarlo con la entidad Post

     public class ApplicationUser : IdentityUser
        {
            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
                return userIdentity;
            }
    
            public string FirstName { get; set; }
    
            //[Required]
            public string LastName { get; set; }
    
            public virtual List<Post> Posts { get; set; }
        }

    De antemano muchísimas gracias.

    Saludos cordiales

    miércoles, 27 de agosto de 2014 23:15

Todas las respuestas

  • >>pero no tengo idea de como relacionar esa tabla con mi tabla Post.

    entiendo que usas entity framework

    el tema es que la definicion de estas entidades estan en contextos diferentes, no las vas a poder relacionar

    no al menos para que valide mediante una integridad referencial, si podrias definir el campo en la entidad Post indicando que recibira un valor que corresponde al id de AspNetUsers

    quizas podrias ver de definir en el contexto de identityuser la tabla post pero que sea solo a fines de crear la relacion, o sea desde el contexto que define la seguridad nunca consultarias la entidad post

    solo desde el contexto de tu negocio es donde accederias a los post

    si se que es medio complejo de explicar, a donde apuntos es que debes definir la entidad post dos veces, en el contexto de la seguridad de asp.net y en el contexto de tu negocio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 28 de agosto de 2014 0:55
  • Hola Leandro, gracias por responder...

    Esa es otra duda, ¿será posible tener mis entidades y las del Identity en un mismo contexto?, así manejaba el simplemebership en el mvc4.

    Saludos

    jueves, 28 de agosto de 2014 13:59
  • Si.

    Añade tus entidades en el ApplicationDbContext. Dicha clase la genera VS y hereda de IdentityDbContext<ApplicationUser>. Las entidades que añadas en este contexto, estarán en el mismo contexto (y BBDD y migraciones) que las clases de Identity, por lo que podrás establecer relaciones entre ellas.

    El hecho de que lo tengas todo en el mismo contexto NO implica que debas usar la BBDD por defecto de identity. Puedes usar la que quieras (la tuya propia) solo cambiando la cadena de conexión en el web.config.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    viernes, 29 de agosto de 2014 9:28
  • >>¿será posible tener mis entidades y las del Identity en un mismo contexto?,

    como comento Eduard si puedes

    pero justamente una de las ventajas de EF6 es poder tener distintos contextos para separar funcionalemte las entidades, de esta forma evitas los contextos enormes a medida que crece tu dominio

    imaginate ese contexto con la definicion de 30 tablas, se hace enorme

    justamente EF6 permite crear varios, ojo puedes apuntar luego ambos contextos a la misma db si lo necesitas

    yo recomendaria que veas de usarlos separados, asi la seguridad la defines en uno y el dominio de tu aplicacion en otro, solo une alli donde requieras relacionar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 29 de agosto de 2014 10:59
  • Gracias por responder Eduard y Leandro!!

    Hice exactamento eso, inclui mis entidades en el contexto del Identity, hasta ahora todo parece funcionar. Ahora quisiera saber si entendi bien, ¿es mejor utilizar dos contextos y dos bases de datos?, o sea la mia y la que genera el Identity? de ser asi, que pasaria con la integridad relacional entre mi tabla Post y la tabla aspnetusers?

    Saludos

    viernes, 29 de agosto de 2014 13:00
  • MMMmm...

    Usar varios contextos de EF no implica tener varias BBDD. Como Leandro ha comentado antes puedes tener varios contextos de EF en una misma BBDD. Pero, si tienes varios contextos ten presente que estos deberían estar desconectados. Es decir, no tendrás FK de una tabla de un contexto a una tabla de otro contexto. Incluso no deberías tener entidades repetidas (la entidad Post o pertenece a un contexto o a otro). Eso es lo que se conoce como bounded contexts, y es una de las técnicas de DDD.

    De todos modos, a no ser que realmente tengas una GRAN aplicación, yo no me liaría y lo colocaría todo en el mismo contexto de EF.

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    lunes, 1 de septiembre de 2014 7:37
  • Buenas,

    Tengo casi el mismo problema.

    En el modelo Post, creó la FK en tabla con el string ID del modelo ApplicationUser?.

    Otra de las cosas que vi que se pueden hacer, es cambiar los nombres a las tablas que se crean por defecto, para que quede mejor.

    Saludos.

    lunes, 12 de enero de 2015 17:04
  • Buenas amigo, tienes aún el ejemplo que hiciste para añadir esta configuración.

    Gracias de antemano.

    lunes, 12 de febrero de 2018 16:01
  • Buenas Leandro, tendrás algun ejemplo de cómo realizarlo?

    Gracias.

    lunes, 12 de febrero de 2018 16:10