none
E.F. 5.0, Code First, Grabar Maestro-Detalle RRS feed

  • Pregunta

  • Tengo este modelo, Factura, FacturaDet

    Las clases FacturaM, FacturaMDet es solo un modelo de donde saco los datos

    public class Factura
    {
        public int ID { get; set; }
        public int FacturaID { get; set; }
        public DateTime FechaDeFactura { get; set; }
        public ICollection<FacturaDet> FacturaDet { get; set; }
    }

    public class FacturaDet
    {
        public int ID { get; set; }
        [Required]
        public int FacturaID { get; set; }
        [Required]
        public int NroFila { get; set; }
        [Required]
        [StringLength(20)]
        public string ProductoID { get; set; }
        [Required]
        public decimal Stock { get; set; }
        [Required]
        public decimal Cantidad { get; set; }

        public virtual Factura Factura { get; set; }
    }

    public class FacturasALDB : DbContext
    {
        public FacturasALDB()
            : base("FacturasALDBConnection")
        {
        }
        public DbSet<Factura> Factura { get; set; }
        public DbSet<FacturaDet> FacturaDet { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }

    En este método es don de grabo: Solo graba en la tabla Factura y no graba en FacturaDet, sale este mensaje de error:

    Se produjo un error mientras se actualizaban las entradas. Vea la excepción interna para obtener detalles

    [HttpPost]
    public ActionResult Create(FacturaM facturaM)
    {
        if (ModelState.IsValid)
        {
            Factura factura = new Factura();
            factura.FacturaID = facturaM.FacturaID;
            factura.FechaDeFactura = facturaM.FechaDeFactura;
            db.Factura.Add(factura);
            foreach (VENTAS.Entidades.FacturaMDet facturaMDet in facturaM.FacturaMDets)
            {
                FacturaDet facturaDet = new FacturaDet();
                facturaDet.FacturaID = facturaM.FacturaID;
                facturaDet.NroFila = 1;
                facturaDet.ProductoID = facturaMDet.ProductoID;
                facturaDet.Stock = facturaMDet.Stock;
                facturaDet.Cantidad = facturaMDet.Cantidad;
                db.FacturaDet.Add(facturaDet);
            }
            db.SaveChanges();
        }
        return RedirectToAction("Index");
    }

    Saludos, Limberg.

    martes, 17 de septiembre de 2013 13:01

Respuestas

  • es que debes instancira la lista

    factura.FacturaDet = new List<FacturaDet>();
    
     foreach (VENTAS.Entidades.FacturaMDet facturaMDet in facturaM.FacturaMDets)
    {
    	FacturaDet facturaDet = new FacturaDet();
    	
    	//se asignan las propiedades
    	
    	factura.FacturaDet.Add(facturaDet);
    }



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP martes, 17 de septiembre de 2013 18:58
    • Marcado como respuesta Limberg2 lunes, 9 de febrero de 2015 19:22
    martes, 17 de septiembre de 2013 18:57

Todas las respuestas

  • hola

    y si en lugar de usar

    db.FacturaDet.Add(facturaDet);

    usas

    factura.FacturaDet.Add(facturaDet);

    o sea agregas el item de la factura a la entidad sin usar el contexto

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 17 de septiembre de 2013 16:43
  • Leandro, me da este mensaje de error, en esta línea:

    factura.FacturaDet.Add(facturaDet);

    Referencia a objeto no establecida como instancia de un objeto.

    Saludos, Limberg.

    martes, 17 de septiembre de 2013 18:21
  • es que debes instancira la lista

    factura.FacturaDet = new List<FacturaDet>();
    
     foreach (VENTAS.Entidades.FacturaMDet facturaMDet in facturaM.FacturaMDets)
    {
    	FacturaDet facturaDet = new FacturaDet();
    	
    	//se asignan las propiedades
    	
    	factura.FacturaDet.Add(facturaDet);
    }



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP martes, 17 de septiembre de 2013 18:58
    • Marcado como respuesta Limberg2 lunes, 9 de febrero de 2015 19:22
    martes, 17 de septiembre de 2013 18:57
  • Gracias Leandro,

    Cuando se graba datos de mas de una tabla con E.F. ¿Es necesario abrir una transaccion?

    Saludos, Limberg.

    martes, 17 de septiembre de 2013 20:42
  • ¿Es necesario abrir una transaccion?

    seria recomendable

    es mas para validarlo podrias habilitar el Sql Profiler y ver que queries se estas creando cuando envias a persistir ese modelo

    seguramente veras que se impacta en mas de una tabla


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 18 de septiembre de 2013 0:16