none
Reemplazar Código Id por su Descripción para visualizarlo. RRS feed

  • Pregunta

  • Hola

    Tengo las dos siguientes tablas pero sin las relaciones.

    Dichas tablas no las tengo relacionadas, sino que cuando edito o creo lo hago a través de un droplistview, pero a lo estar relacionadas no se como puedo mostrar en detalles el número de "Cuenta".

    No se si sería mejor hacer las relaciones, si se pueden hacer y/o como hacerlas. El caso es que cuando muestro los detalles del articulo, mediante displayfor, me muestre la "Cuenta" y no su código "PGCId".

    Un Saludo

    viernes, 8 de febrero de 2019 22:38

Respuestas

  • Si quieres que te funcionen los automatismos, entonces es necesario que tengas las tablas relacionadas. De lo contrario, tendrás que escribir a mano todo el código para hacer cosas tales como obtener la cuenta a partir del ID que tiene en la tabla de artículos. Además, relacionar las tablas tiene la ventaja de que el propio servidor de base de datos valida la corrección de los datos (p. ej. no te deja ponerle al artículo una cuenta que no existe en la tabla de cuentas). En resumen, recomiendo que pongas la relación entre las tablas.

    ¿Cómo se hacen? Depende de cómo estés creando la base de datos. A mí me gusta escribir manualmente el script de creación tecleando los "create table...". En ese caso las relaciones se ponen añadiendo una cláusula "foreign key" en el script. Si lo haces gráficamente desde una herramienta como SSMS, se hace con el menú de contexto desde el diseñador. Si es un programa con EF Code First, se hace desde el fuente poniendo la colección virtual en la clase madre y el campo padre virtual en la clase hija.

    • Marcado como respuesta elturle sábado, 9 de febrero de 2019 14:38
    sábado, 9 de febrero de 2019 8:33
  • hola

    >>No se si sería mejor hacer las relaciones, si se pueden hacer y/o como hacerlas.

    siempre es recomendable realizar las relaciones en la db

    ahora bien si usas entity framework deberias mapear esta relacion un a muchos

    Configure One-to-Many Relationships in EF 6

    en tu caso vas a mapear 3 veces la misma tabla una por cada relacion de cuenta

     modelBuilder.Entity<Articulo>()
                .HasRequired<PGC>(s => s.PGCCtaExistencias)
                .WithMany(g => g.ArticulosExis)
                .HasForeignKey<int>(s => s.CtaExistencias);
    
     modelBuilder.Entity<Articulo>()
                .HasRequired<PGC>(s => s.PGCCtaGasto )
                .WithMany(g => g.ArticulosGasto )
                .HasForeignKey<int>(s => s.CtaGasto);


    y asi tambien la ultima

    Para el HasForeignKey() recuerda dfinir la propiedad que coincida con el nombre de la tabla "Articulo"

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta elturle sábado, 9 de febrero de 2019 14:38
    sábado, 9 de febrero de 2019 13:38

Todas las respuestas

  • Si quieres que te funcionen los automatismos, entonces es necesario que tengas las tablas relacionadas. De lo contrario, tendrás que escribir a mano todo el código para hacer cosas tales como obtener la cuenta a partir del ID que tiene en la tabla de artículos. Además, relacionar las tablas tiene la ventaja de que el propio servidor de base de datos valida la corrección de los datos (p. ej. no te deja ponerle al artículo una cuenta que no existe en la tabla de cuentas). En resumen, recomiendo que pongas la relación entre las tablas.

    ¿Cómo se hacen? Depende de cómo estés creando la base de datos. A mí me gusta escribir manualmente el script de creación tecleando los "create table...". En ese caso las relaciones se ponen añadiendo una cláusula "foreign key" en el script. Si lo haces gráficamente desde una herramienta como SSMS, se hace con el menú de contexto desde el diseñador. Si es un programa con EF Code First, se hace desde el fuente poniendo la colección virtual en la clase madre y el campo padre virtual en la clase hija.

    • Marcado como respuesta elturle sábado, 9 de febrero de 2019 14:38
    sábado, 9 de febrero de 2019 8:33
  • Muchas Gracias Alberto.

    La gestón de las tablas la hago con EF Code First. Por lo que en el modelo de "Cuenta" se supone que tengo que poner tres instrucciones como la siguiente:

    public virtual PGC PGCCtaExistencias { get; set; }
    public virtual PGC PGCCtaGasto { get; set; }
    public virtual PGC PGCCtaVenta { get; set; }

    Y en el modelo "PGC" supongo yo que tendre que crear otras tres instrucciones, pero no estoy seguro.

    public virtual ICollection<Articulo> ArticulosExis { get; set; }
    public virtual ICollection<Articulo> ArticulosGasto { get; set; }
    public virtual ICollection<Articulo> ArticulosVenta { get; set; }

    No se si se haría así y como sabe el sistema a que relación de la tabla P2GC" le corresponde la de la tabla "Artículo".

    Ya me comentarás si es la forma de hacerlo y si lo estoy haciendo mal.

    Un Saludo

    sábado, 9 de febrero de 2019 9:21
  • hola

    >>No se si sería mejor hacer las relaciones, si se pueden hacer y/o como hacerlas.

    siempre es recomendable realizar las relaciones en la db

    ahora bien si usas entity framework deberias mapear esta relacion un a muchos

    Configure One-to-Many Relationships in EF 6

    en tu caso vas a mapear 3 veces la misma tabla una por cada relacion de cuenta

     modelBuilder.Entity<Articulo>()
                .HasRequired<PGC>(s => s.PGCCtaExistencias)
                .WithMany(g => g.ArticulosExis)
                .HasForeignKey<int>(s => s.CtaExistencias);
    
     modelBuilder.Entity<Articulo>()
                .HasRequired<PGC>(s => s.PGCCtaGasto )
                .WithMany(g => g.ArticulosGasto )
                .HasForeignKey<int>(s => s.CtaGasto);


    y asi tambien la ultima

    Para el HasForeignKey() recuerda dfinir la propiedad que coincida con el nombre de la tabla "Articulo"

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta elturle sábado, 9 de febrero de 2019 14:38
    sábado, 9 de febrero de 2019 13:38
  • Muchas Gracias por vuestras respuestas.
    sábado, 9 de febrero de 2019 14:39