none
Insertar relación n a n

    问题

  • Hola.

    Necesito tener una relación n a n entre dos tablas, y quisiera que me recomienden la mejor forma de hacerlo.

    Lo que hice, pero no se si es lo ideal, es crear una entidad que sea igual a la tabla relacion entre las dos tablas e ir poniendo los id de cada tabla y guardando.

     foreach (var item in ordenpago.DocumentosAPagar)
                    {
           
                            //creo la relacion
    
                            OrdenPagoDocumentoProveedor relacion = new OrdenPagoDocumentoProveedor();
                            relacion.DocumentoProveedorID = doc.DocumentoProveedorId;
                            relacion.OrdenPagoID = ordenpago.EstadoOrdenPagoID;
                            db.OrdenPagoDocumentoProveedor.Add(relacion);
                            
                        }
                        
                    

    El problema con esta forma, es que cuando mando a guardar, me da un error de FK, porque el id de la orden de pago todavía no se insertó y es cero.

    hay alguna otra manera?

    muchas gracias desde ya.

    2012年2月16日 17:24

全部回复

  • Estas usando algún ORM como EF?

    • 已标记为答案 sepilrat 2012年2月16日 18:01
    • 取消答案标记 sepilrat 2012年2月16日 18:01
    2012年2月16日 17:44
  • Hola.

    si, estoy usando entity framework,  Lo declaro de esta manera en el controlador.

     private Context db = new  Context();

    y de esta forma en context

     public DbSet<OrdenPago> OrdenPago { get; set; }

    PAra facilitar las cosas, replanteo la pregunta.

    tengo dos tablas relacionadas n a n : A AB B  necesito insertar A que tiene una lista de B

    Muchas gracias desde ya. 

    • 已编辑 sepilrat 2012年2月16日 18:05
    2012年2月16日 17:48
  • Bien las tablas en sql, son estas o algo similar?


    -OrdenPago
    -DocumentoProveedor

    Y el OrdenPago tiene un DocumentoProveedor?

    Si obvias..OrdenPagoDocumentoProveedor relacion y guardar/obtener el DocumentoProveedor primero 
    y despues guardas el OrdenPago.

    algo asi.
    db.DocumentoProveedor.Add(documentoProveedor)
    ordenPago.DocumentoProveedor = documentoProveedor.
    db.OrdenPago.Add(ordenPago)
    SaveChanges()

    Perdón pero no estoy con vs.

    2012年2月16日 18:09
  • Gracias por responder.

    mis clases:

     [Table("OrdenesPago")]
        public class OrdenPago
        {
            [Key]
            public int OrdenPagoID { get; set; }
            public DateTime Fecha { get; set; }
            public Proveedor Proveedor { get; set; }
            public int ProveedorID{ get; set; }
           	[NotMapped]      
           public List<documentoproveedor>DocumentosPagados { get; set; } 	//Esto lo tengo con notMAped, porque sino busca IdOrdenPago en documentoProveedor y no existe ahi
           }
        }</documentoproveedor>

    [Table("DocumentosProveedor")]
        public class DocumentoProveedor
        {
           
            [Key]
            public int DocumentoProveedorId { get; set; }
           
            public TipoDocumento TipoDocumento { get; set; }
            public int TipoDocumentoID { get; set; }
                   
           [RegularExpression(@"^(\d){3}$",ErrorMessage="El formato para la sucursal es de tres dígitos enteros: 001")]
            public string Sucursal { get; set; }
           [RegularExpression(@"^(\d){8}$", ErrorMessage = "El formato para el número de documento es de 8 dígitos enteros 00000001")]
            public string NroDocumento { get; set; }
    

    En la base de datos, tengo una tabla para las ordenes de pago y otra para documentosProveedor (facturas)

    cuando creo la orden de pago, selecciono una o varias facturas de la lista  y quiero que esa relación quede registrada.

    por lo tanto en la base de dato cree 3 tablas.


    OrdenPago
    DocumentosProveedor
    OrdenPagoDocumentoProveedor

    Orden de pago es una entidad nueva
    DocumentosProveedor esta precargado 



    • 已编辑 sepilrat 2012年2月16日 18:40
    2012年2月16日 18:29
  • MMM

    Con este mapeo en OrdenPago...deberia andar.

    public List<documentoproveedor>DocumentosPagados { get; set; } 

    2012年2月16日 18:51
  • ME da error cuando trato de listar los DocumentosProveedor. Aparentemente buscar el IdOrdenPago en DocumentoProveedor y lógicamente no lo encuentra, porque está en la tabla intermendia.

    Invalid column name 'OrdenPago_OrdenPagoID'.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código. 
    Línea 105:            foreach (var item in listaCCProv)
    Línea 106:            {
    Línea 107:                doc = (from fac in db.DocumentoProveedor.Include("TipoDocumento") where fac.Sucursal == item.Sucursal
    Línea 108:                           && fac.NroDocumento == item.NumeroFormulario && fac.EstadoDocumentoProveedorID!=3
    Línea 109:                           && fac.EstadoDocumentoProveedorID != 4 

    2012年2月16日 18:59
  • Gracias por la ayuda. Ya lo resolví. 

    El problema era que estaba poniendo los ID de la tabla intermedia, sin respetar la convención para la denominación de las FK.

    Saludos

    2012年2月17日 18:58