Respondida Genera tablas y columnas con otro nombre

  • viernes, 23 de diciembre de 2011 15:51
     
      Tiene código

    Buenos dias

    Tengo dos entidades, Categoria y Producto. Producto tiene una llave foranea de Categoria.

    public class CategoriaDTO
        {
            [Key]
            public Int32 IdCategoria { get; set; }
    
            [Required, StringLength(50), RegularExpression("[a-zA-Z ]*")]
            public string Nombre { get; set; }
    
            public IList<ProductoDTO> LProductos = new List<ProductoDTO>();
        }
    
     public class ProductoDTO
        {
            [Key]
            public Int32 IdProducto { set; get; }
    
            [Required, Column("IdCategoria")]
            public CategoriaDTO Categoria { set; get; }
    
            [Required, Column("IdProveedor")]
            public ClienteDTO Proveedor { set; get; }
    
            [Required, MaxLength(100)]
            public string Nombre { set; get; }
    
            [Required]
            public double Precio { set; get; }
        }
    

    ---

    Estoy definiendo las entidades hacia la bd con EntityTypeConfiguration, y en producto tengo esto:

    public class ProductoConfiguration : EntityTypeConfiguration<ProductoDTO>
        {
            public ProductoConfiguration()
            {
                ToTable("Producto");
                Property(c => c.IdProducto).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                Property(c => c.Categoria.IdCategoria).HasColumnName("IdCategoria").IsRequired();
                Property(c => c.Proveedor.IdCliente).HasColumnName("IdCliente").IsRequired();
                Property(c => c.Nombre).HasMaxLength(100).IsRequired();
                Property(c => c.Precio).IsRequired();
            }
        }
    

    Genero la base de datos, pero en las tablas de la base de datos me aparece ProductoDTOes, cuando yo ya le he colocado que ira a la tabla Producto, que puede estar pasando¿?

    A parte de eso, como pueden ver me esta generando las columnas de llave foranea de con 'Categoria_IdCategoria', pero 

    yo deseo que sea solo 'IdCategoria', como puedo hacer estos 2 cambios¿?,

    el nombre de las tablas y el de las columnas de llave foranea¿?¿?

     

    Un saludo y muchas gracias

Todas las respuestas

  • miércoles, 04 de enero de 2012 11:08
     
     Respondida

    Hola,

    A la hora de generar la base de datos desde el modelo dependiendo de la propiedad "Pluralize New Objects", 'pluraliza' o no el nombre de las tablas.

    Respecto a la clave foránea, en el mismo modelo, seleccionando la relación puedes modificarlo. 

    Recuerda que cada vez que generes el modelo (y ejecutes el script resultante) se borrarán las tablas que hayas creado y se volverán a crear.

    En lugar de utilizar "Code First", puedes crear las tablas primero en base de datos (y sus relaciones) y crear el modelo desde base de datos.

     

     


    • Editado Domingo Samper Lara miércoles, 04 de enero de 2012 11:15
    • Marcado como respuesta ccmmasi jueves, 08 de marzo de 2012 21:49
    •  
  • jueves, 08 de marzo de 2012 21:49
     
     Respondida

    Como no estoy utilizando ninguna interfaz de diseño para ayudarme, no se como puedo utilizar ese pluralize... en efecto me los esta dejando en plural.. ... bueno, he decidido dejarlo asi, igual me funciona, me enlaza la tabla con la clase con el objeto de mapeo que genere...

    muchas gracias Domingo

    • Marcado como respuesta ccmmasi jueves, 08 de marzo de 2012 21:49
    •  
  • sábado, 10 de marzo de 2012 23:10
     
      Tiene código

    Hola ccmmasi,

    No es bueno rendirse y todo tiene una explicación, veo que estás utilizando CodeFirst nos puedes mostrar el metodo OnModelCreating de tu Contexto es decir de la clase que hereda de DbContext.

    Eso si puedes me gustaría verlo puesto que es en ese metodo donde tienes que agregar a la clase ProductConfiguration

    de esta forma

    modelBuilder.Configurations.Add(new ProductConfiguration());

    Otra opción es que no utilices esta clase y que utilices  System.ComponentModel.DataAnnotations y concretamente el atributo Table es decir que tu clase quede decorada de la siguiente forma.

    [Table("Producto")]
    public class ProductoDTO
        {
            [Key]
            public Int32 IdProducto { set; get; }
    
            [Required, Column("IdCategoria")]
            public CategoriaDTO Categoria { set; get; }
    
            [Required, Column("IdProveedor")]
            public ClienteDTO Proveedor { set; get; }
    
            [Required, MaxLength(100)]
            public string Nombre { set; get; }
    
            [Required]
            public double Precio { set; get; }
        }
    

    Ahora elige uno de los dos caminos o bien definir tus clases con atributos o bien utilizar Fluent Api de Codefirst que es lo que estás haciendo en la clase ProductConfiguration.

    Saludos,


    phurtado