none
Does not declare a navigation property with the name 'XXX'. RRS feed

  • Pregunta

  • Hola:

     Tengo las siguientes clases:

        public class Precios
        {
            public Precios()
            {
                ProveedoresMateriales = new ProveedoresMateriales();
            }
            public int PrecioId { get; set; }
            public int ProveedorMaterialId { get; set; }
            public decimal PrecioVenta { get; set; }
            public Status Status { get; set; }
            public DateTime FechaCambio { get; set; }
    
            public virtual ProveedoresMateriales ProveedoresMateriales { get; set; }
        }

    ----

        public class ProveedoresMateriales
        {
            public ProveedoresMateriales()
            {
                Precios = new HashSet<Precios>();
            }
            public int ProveedorMaterialId { get; set; }
            public int ProveedorId { get; set; }
            public int MaterialId { get; set; }
    
            public virtual Materiales Materiales { get; set; }
            public virtual Proveedores Proveedores { get; set; }
            public virtual IEnumerable<Precios> Precios { get; set; }
        }

     Que conforman la siguiente relacion en la BD:

     Por medio de Linq necesito recuperar todo el Material, Nombre del material, nombre del proveedor y precio del Material a partir del Numero de proveedor.

     Por lo cual estoy usando esta consulta Linq:

                using (var context = new Context())
                {
                    var xxx = (from x  in context.ProveedoresMateriales
                               .Include(x => x.Materiales)
                               .Include(x => x.Proveedores)
                               .Include(x => x.Precios).Where(x => x.ProveedorId.Equals(7))
                               select x).ToList();
                    
                    return xxx;
    
                }

     Pero lo que obtengo es esta excepcion:

    A specified Include path is not valid. The EntityType 'xxxx.Persistencia.Modelo.ProveedoresMateriales' does not declare a navigation property with the name 'Precios'.

    ¿Alguna idea de como poder agregar Precios al resultado de mi consulta?

    Gracias por adelantado.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 1 de julio de 2015 22:52

Respuestas

  • >>El tema es que se requiere de un Catalogo universal de Materiales y que cada proveedor pueda definir precios particulares sobre este catalogo

    no entendi, eso que tiene que ver con lo que comento de diseñar diferente las tablas segun un mejor modelo de entidades

    yo nunca comente que no puedes definir un catalogo universal, lo que digo es que el diseño lo estas pensando desde el db cuando deberias hacerlo desde un modelo de clases

    >>un Material puede ser Manejado por muchos proveedores, Un Material tiene distintos precios según el proveedor que lo maneja.

    si eso esta claro

    pero porque definir en el precio un id a una tabla de relacion en lugar de hacerlo a las tablas de materiales y proveedores ?

    >>me recomienda aun asi eliminar la tabla ProveedoresMateriales?

    no digo qe debes eliminar la tabla, lo que digo es que debes modelar una relacion muchos a muchos en entity framework

    y para lograr eso no se define un key en la tabla de relacion

    tu tabla deberia ser

    ProveedoresMateriales (tabla)
    MaterialId  PK  FK
    ProveedorId  PK  FK

    seria mas simple si modelas las clases e EF y haces que este genere la estructura de tu db

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 2 de julio de 2015 1:43
  • hola

    >>si ya tengo la tabla ProveedoresMateriales con la relación de Proveedor Material no es redundante crear esta misma relación en la tabla Precios?

    piensa como lo modelarias con clases, no agregarias en la entidad precio una propiedad a Materiales y otra a Proveedores ?

    igual remarco un punto, si solo diseñas base de datos lo comun es ver que la tabla precios se une a la tabla intermedia como tu lo modelaste, solo que la key unica en ProveedoresMateriales no es necesaria, podria ser una key compuesta entre MaterialId y ProveedorId

    ahora bien estas usando EF por lo que al definir una relacion muchos a muchos la "entidad" intermedia que unes Materiales y Proveedores no la tienes como una clase por eso es que precio no puedes unirlo a esta directamente, sino que unes Precio con Material y Preveedor de forma individual

    -------

    habiendo dicho esto existe otra forma de modelar tu caso en donde el modelo de clases y de tablas se asemejan

    que pasa si haces esto

    Materiales (tabla)
    MaterialId  PK
    Descripcion
    //resto campos
    
    
    Precio (tabla)
    MaterialId     FK PK
    ProveedorId   FK PK
    PrecioVenta
    Status
    
    Proveedores (tabla)
    ProveedorId  PK
    Nombre

    o sea usas la entidad/tabla de precios para relacionar materales y proveedores y a esa union le pones un monto

    en este caso la tabla ProveedoresMateriales ya no la defines

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 2 de julio de 2015 2:28
  • hola

    es que estas diseñando de forma incorrecta tu base de datos

    esa tabla ProveedoresMateriales es una intermedia para definri la relacion muchos a muchos entre Proveedores y Materiales, por lo que no se le define una key simple, sino que es compuesta por los campos MaterialId y ProveedorId

    revisa este articulo

    [Entity Framework][Code First] Asociación mucho a muchos

    como veras la entidad intermedia no se modela

    ------

    si el precio se determina de la union entre del material y el proveedor entonces la tabla precio debe tener ambos campo MaterialId y ProveedorId

    o sea

    Precio (tabla)
    MaterialId     FK PK
    ProveedorId   FK PK
    PrecioVenta
    Status

    en este caso no defino una key simple para la tabla precio ya que solo se podra definir un monto cuando se una un material a un proveedor es una key compuesta

    lo que no recomendaria es que ates esa relacion a una tabla intermedia que une el material al proveedor, si quieres desde tu programa validas que no se pueda poner un precio a un material que no este unido a un proveedor

    recuerda modela objetos no tablas en tu base de datos, defien tu diagrama de clases como debe de ser y despues y solo despues analiza como lo mapeas a tablas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    jueves, 2 de julio de 2015 0:49
  • >>pero si la entidad Precios no tiene un campo como Primary Key me arroja este mensaje de erro

    pero es que tiene que tener una key, le defienes el PrecioId que sea secuencial

    >>la tabla Precios llevara el historial de precios, osea que puede tener mas de un registro que apunte al mismo Material y al Mismo Proveedor

    ok mas facil

    public class Precio{
    
        public int PrecioId {get;set;}
    
         public int ProveedorId {get;set;}
         public int MeterialId {get;set;}
    
        public DateTime Vigencia{get;set;}
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de julio de 2015 14:37

Todas las respuestas

  • Yo uso otro interfaz a la hora de gestionar las relaciones.

    cambia public virtual IEnumerable<Precios> Precios { get; set; }
        por

    public virtual ICollection<Precios> Precios { get; set; }
       


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

    jueves, 2 de julio de 2015 0:08
    Moderador
  • hola

    es que estas diseñando de forma incorrecta tu base de datos

    esa tabla ProveedoresMateriales es una intermedia para definri la relacion muchos a muchos entre Proveedores y Materiales, por lo que no se le define una key simple, sino que es compuesta por los campos MaterialId y ProveedorId

    revisa este articulo

    [Entity Framework][Code First] Asociación mucho a muchos

    como veras la entidad intermedia no se modela

    ------

    si el precio se determina de la union entre del material y el proveedor entonces la tabla precio debe tener ambos campo MaterialId y ProveedorId

    o sea

    Precio (tabla)
    MaterialId     FK PK
    ProveedorId   FK PK
    PrecioVenta
    Status

    en este caso no defino una key simple para la tabla precio ya que solo se podra definir un monto cuando se una un material a un proveedor es una key compuesta

    lo que no recomendaria es que ates esa relacion a una tabla intermedia que une el material al proveedor, si quieres desde tu programa validas que no se pueda poner un precio a un material que no este unido a un proveedor

    recuerda modela objetos no tablas en tu base de datos, defien tu diagrama de clases como debe de ser y despues y solo despues analiza como lo mapeas a tablas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina



    jueves, 2 de julio de 2015 0:49
  • Hola Sergio:

     Otra pregunta, cual es la diferencia entre una y otra si las dos cargan Colecciones?, con el cambio que sugieres ya no recibo el mensaje de error, pero aun no veo cargados los datos de precios.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 2 de julio de 2015 0:50
  • Hola Leandro.

     Muchas gracias, analizo el articulo sugerido.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 2 de julio de 2015 0:56
  • Hola Leandro:

    lo que no recomendaria es que ates esa relacion a una tabla intermedia que une el material al proveedor, si quieres desde tu programa validas que no se pueda poner un precio a un material que no este unido a un proveedor

     El tema es que se requiere de un Catalogo universal de Materiales y que cada proveedor pueda definir precios particulares sobre este catalogo, de ahi que me haya decidido por crear una tabla intermedia para Unir el Proveedor y el Material para de esta manera poder conocer que proveedor maneja que materiales y que precio maneja ese proveedor en particular para ese material en especifico.

     Prácticamente, un Material puede ser Manejado por muchos proveedores, Un Material tiene distintos precios según el proveedor que lo maneja.

     Sabiendo esto, me recomienda aun asi eliminar la tabla ProveedoresMateriales?


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 2 de julio de 2015 1:35
  • >>El tema es que se requiere de un Catalogo universal de Materiales y que cada proveedor pueda definir precios particulares sobre este catalogo

    no entendi, eso que tiene que ver con lo que comento de diseñar diferente las tablas segun un mejor modelo de entidades

    yo nunca comente que no puedes definir un catalogo universal, lo que digo es que el diseño lo estas pensando desde el db cuando deberias hacerlo desde un modelo de clases

    >>un Material puede ser Manejado por muchos proveedores, Un Material tiene distintos precios según el proveedor que lo maneja.

    si eso esta claro

    pero porque definir en el precio un id a una tabla de relacion en lugar de hacerlo a las tablas de materiales y proveedores ?

    >>me recomienda aun asi eliminar la tabla ProveedoresMateriales?

    no digo qe debes eliminar la tabla, lo que digo es que debes modelar una relacion muchos a muchos en entity framework

    y para lograr eso no se define un key en la tabla de relacion

    tu tabla deberia ser

    ProveedoresMateriales (tabla)
    MaterialId  PK  FK
    ProveedorId  PK  FK

    seria mas simple si modelas las clases e EF y haces que este genere la estructura de tu db

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 2 de julio de 2015 1:43
  • Hola:

    no digo qe debes eliminar la tabla, lo que digo es que debes modelar una relacion muchos a muchos en entity framework

    y para lograr eso no se define un key en la tabla de relacion

     Ahora entiendo esto que mencionas, entonces la tabla ProveedoresMateriales se usa únicamente para manejar esta relación y Precios para definir los precios para cada Material según proveedor pero, me nace otra duda, si ya tengo la tabla ProveedoresMateriales con la relación de Proveedor Material no es redundante crear esta misma relación en la tabla Precios?

     Me gustaría comprender totalmente esto que me planteas para así mejorar mi diseño y mi lógica para pensar estas relaciones a futuro.


    Saludos desde Monterrey, Nuevo León, México!!!


    jueves, 2 de julio de 2015 2:09
  • hola

    >>si ya tengo la tabla ProveedoresMateriales con la relación de Proveedor Material no es redundante crear esta misma relación en la tabla Precios?

    piensa como lo modelarias con clases, no agregarias en la entidad precio una propiedad a Materiales y otra a Proveedores ?

    igual remarco un punto, si solo diseñas base de datos lo comun es ver que la tabla precios se une a la tabla intermedia como tu lo modelaste, solo que la key unica en ProveedoresMateriales no es necesaria, podria ser una key compuesta entre MaterialId y ProveedorId

    ahora bien estas usando EF por lo que al definir una relacion muchos a muchos la "entidad" intermedia que unes Materiales y Proveedores no la tienes como una clase por eso es que precio no puedes unirlo a esta directamente, sino que unes Precio con Material y Preveedor de forma individual

    -------

    habiendo dicho esto existe otra forma de modelar tu caso en donde el modelo de clases y de tablas se asemejan

    que pasa si haces esto

    Materiales (tabla)
    MaterialId  PK
    Descripcion
    //resto campos
    
    
    Precio (tabla)
    MaterialId     FK PK
    ProveedorId   FK PK
    PrecioVenta
    Status
    
    Proveedores (tabla)
    ProveedorId  PK
    Nombre

    o sea usas la entidad/tabla de precios para relacionar materales y proveedores y a esa union le pones un monto

    en este caso la tabla ProveedoresMateriales ya no la defines

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 2 de julio de 2015 2:28
  • Hola Leandro:

     Ya cree la tabla ProveedoresMateriales pero usando la misma logica como seria para crear la tabla Precios?

    Intento con esto en el Map de Materiales pero no encuentro como crear las columnas adicionales.

            public MaterialesMap()
            {
                ToTable("Materiales");
                HasKey(c => c.MaterialId);
                Property(c => c.MaterialId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                Property(c => c.MaterialId).HasColumnOrder(1);
                Property(c => c.CategoriaId).IsRequired().HasColumnOrder(2);
                //resto de propiedades
    
                HasMany(x => x.Precios)
                    .WithMany(x => x.Materiales)
                    .Map(mc =>
                    {
                        mc.MapLeftKey("ProveedorId");
                        mc.MapRightKey("MaterialId");
                        mc.ToTable("Precios");
                    });
            }

    Si trato de generar el Map y modelo la tabla Precios me envia el siguiente mensaje de error:

    One or more validation errors were detected during model generation:

    xxx.Persistencia.Modelo.Precios: : EntityType 'Precios' has no key defined. Define the key for this EntityType.
    Precios: EntityType: EntitySet 'Precios' is based on type 'Precios' that has no keys defined.

    Ya que la tabla Precios no contiene un campo como PrimaryKey

    Como seria para esta parte?



    Saludos desde Monterrey, Nuevo León, México!!!




    jueves, 2 de julio de 2015 23:36
  • hola

     >>Ya cree la tabla ProveedoresMateriales pero usando la misma logica como seria para crear la tabla Precios?

    pero no deberias usar

    mc.ToTable("ProveedoresMateriales");

    la tabla Precios seria una entidad separada que se relaciona con materiales y proveedores de forma normal con relaciones uno a mucho

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 3 de julio de 2015 3:36
  • Hola Leandro:

     Entiendo esto, pero si la entidad Precios no tiene un campo como Primary Key me arroja este mensaje de erro:

    xxx.Persistencia.Modelo.Precios: : EntityType 'Precios' has no key defined. Define the key for this EntityType.
    Precios: EntityType: EntitySet 'Precios' is based on type 'Precios' that has no keys defined.

    Cabe mencionar que la tabla Precios llevara el historial de precios, osea que puede tener mas de un registro que apunte al mismo Material y al Mismo Proveedor pero con diferente Precios y FechaCambio pero solo un registro sera el precio vigente.


    Saludos desde Monterrey, Nuevo León, México!!!

    viernes, 3 de julio de 2015 14:25
  • >>pero si la entidad Precios no tiene un campo como Primary Key me arroja este mensaje de erro

    pero es que tiene que tener una key, le defienes el PrecioId que sea secuencial

    >>la tabla Precios llevara el historial de precios, osea que puede tener mas de un registro que apunte al mismo Material y al Mismo Proveedor

    ok mas facil

    public class Precio{
    
        public int PrecioId {get;set;}
    
         public int ProveedorId {get;set;}
         public int MeterialId {get;set;}
    
        public DateTime Vigencia{get;set;}
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de julio de 2015 14:37
  • Hola Leandro.

     Disculpa, me confundí con esta sugerencia.

    Precio (tabla)
    MaterialId     FK PK
    ProveedorId   FK PK
    PrecioVenta
    Status

    Entonces ingreso el campo PrecioId.


    Saludos desde Monterrey, Nuevo León, México!!!

    viernes, 3 de julio de 2015 14:38