title: ForeignKeyConstraint requires the child key values (0) to exist in the parent table
body: <p>I can`t INSERT ROW master - details.</p>
  
  <pre><code>    private string strSelectComprobante()
      {
          string strSQL;
          strSQL = "  SELECT ";
          strSQL += "     TbComprobante.NroCpte,";
          strSQL += "     TbComprobante.TipoCpte,";
          strSQL += "     TbComprobante.Fecha,";      //0
          strSQL += "     TbComprobante.Cliente,";    //1
          strSQL += "     TbComprobante.Usuario,";
          strSQL += "     TbComprobante.Descripcion";
          strSQL += " FROM";
          strSQL += "     TbComprobante";
          strSQL += " WHERE";
          strSQL += "     TbComprobante.TipoCpte = 'S'";
          if (!blnTodos)
          {
              strSQL += "     AND TbComprobante.NroCpte = 0 ";
          }
  
          return strSQL;
      }
  
      private string strUpdateComprobante()
      {
          string strSQL;
          strSQL = "  UPDATE TbComprobante SET ";
          strSQL += "     TbComprobante.Fecha = ?Fecha,";      //0
          strSQL += "     TbComprobante.Cliente = ?Cliente,";    //1
          strSQL += "     TbComprobante.Usuario = ?Usuario,";
          strSQL += "     TbComprobante.Descripcion = ?Descripcion";
          strSQL += " WHERE";
          strSQL += "     TbComprobante.NroCpte = ?NroCpte";
          strSQL += "     AND TbComprobante.TipoCpte = 'S'";
  
          return strSQL;
      }
  
      private string strInsertComprobante()
      {
          string strSQL;
          strSQL = "  INSERT INTO TbComprobante ( ";
          strSQL += "     NroCpte,";        //0
          strSQL += "     TipoCpte,";
          strSQL += "     Fecha,";       //2
          strSQL += "     Cliente,";       //3
          strSQL += "     Usuario,";
          strSQL += "     Descripcion)";
          strSQL += " VALUES(";
          strSQL += "     ?NroCpte,";        //0
          strSQL += "     ?TipoCpte,";
          strSQL += "     ?Fecha,";       //2
          strSQL += "     ?Cliente,";       //3
          strSQL += "     ?Usuario,";
          strSQL += "     ?Descripcion)";
          return strSQL;
      }
  
      private string strSelectDetalle()
      {
          string strSQL;
          strSQL = "  SELECT ";
          strSQL += "     TbDetalle.NroCpte,";        //0
          strSQL += "     TbDetalle.NroDetalle,";        //1
          strSQL += "     TbDetalle.TipoCpte,";
          strSQL += "     TbDetalle.Producto,";       //2
          strSQL += "     TbProducto.Denominacion,";
          strSQL += "     TbProducto.Unidad,";
          strSQL += "     TbDetalle.CostoUnt,";       //5
          strSQL += "     TbProducto.PrecioUnt,";
          strSQL += "     TbDetalle.Cantidad,";
          strSQL += "     TbDetalle.Descuento,";
          strSQL += "     TbDetalle.Monto";
          strSQL += " FROM";
          strSQL += "         TbDetalle";
          strSQL += "     INNER JOIN TbProducto ON";
          strSQL += "         TbDetalle.Producto = TbProducto.Producto";
          strSQL += " WHERE";
          strSQL += "     TbDetalle.TipoCpte = 'S'";
          if (!blnTodos)
          {
              strSQL += "     AND TbDetalle.NroCpte = 0 ";
          }              
          strSQL += " ORDER BY";
          strSQL += "     TbDetalle.Producto";
          return strSQL;
      }
  
      private string strUpdateDetalle()
      {
          string strSQL;
          strSQL = "  UPDATE TbDetalle SET ";
          strSQL += "     TbDetalle.TipoCpte = 'S',";
          strSQL += "     TbDetalle.CostoUnt = ?CostoUnt,";       //3
          strSQL += "     TbDetalle.PrecioUnt = ?PrecioUnt,";
          strSQL += "     TbDetalle.Cantidad = ?Cantidad,";
          strSQL += "     TbDetalle.Descuento = ?Descuento,";
          strSQL += "     TbDetalle.Monto = ?Monto";
          strSQL += " WHERE";
          strSQL += "     TbDetalle.NroCpte = ?NroCpte";
          strSQL += "     AND TbDetalle.TipoCpte = 'S'";
          strSQL += "     AND TbDetalle.NroDetalle = ?NroDetalle";
  
          return strSQL;
      }
  
      private string strDeleteDetalle()
      {
          string strSQL;
          strSQL = "  DELETE FROM TbDetalle ";
          strSQL += " WHERE";
          strSQL += "     TbDetalle.NroCpte = ?NroCpte";
          strSQL += "     AND TbDetalle.TipoCpte = 'S'";
          strSQL += "     AND TbDetalle.NroDetalle = ?NroDetalle";
  
          return strSQL;
      }
  
  
      private string strInsertDetalle()
      {
          string strSQL;
          strSQL = "  INSERT INTO TbDetalle ( ";
          strSQL += "     TbDetalle.NroCpte,";        //0
          strSQL += "     TbDetalle.NroDetalle,";
          strSQL += "     TbDetalle.TipoCpte,";
          strSQL += "     TbDetalle.Producto,";       //2
          strSQL += "     TbDetalle.CostoUnt,";       //5
          strSQL += "     TbDetalle.PrecioUnt,";
          strSQL += "     TbDetalle.Cantidad,";
          strSQL += "     TbDetalle.Descuento,";
          strSQL += "     TbDetalle.Monto)";
          strSQL += " VALUES(";
          strSQL += "     ?NroCpte,";
          strSQL += "     ?NroDetalle,";
          strSQL += "     'S',";
          strSQL += "     ?Producto,";
          strSQL += "     ?CostoUnt,";
          strSQL += "     ?PrecioUnt,";
          strSQL += "     ?Cantidad,";
          strSQL += "     ?Descuento,";
          strSQL += "     ?Monto)";
          return strSQL;
      }
  
      private int GrabarNroCpte(long intNroCpte)
      {
          string strSQL;
          MySqlCommand MyCmd;
          int intRowsAfects = 0;
  
          strSQL = "  UPDATE TbNroCpte";
          strSQL += "     SET NroCpte = " + intNroCpte;
          strSQL += " WHERE TipoCpte = 'S'";
  
          try
          {
              MyCmd = new MySqlCommand();
              MyCmd.Connection = Modulos.ClsGlobal.MyNetCnx;
              MyCmd.CommandText = strSQL;
              intRowsAfects  = MyCmd.ExecuteNonQuery();
              return intRowsAfects;
          }
          catch (MySqlException ex)
          {
              MessageBox.Show(ex.Message, "GrabarNroCpte", MessageBoxButtons.OK, MessageBoxIcon.Information);
              return intRowsAfects;
          }
      }
  
      private int GrabarComprobante(long intNroCpte)
      {
          int intRowsAfects = 0;
          try
          {
              //Actualiza comprobante
              CMDComprobante = new MySqlCommand(strUpdateComprobante(), Modulos.ClsGlobal.MyNetCnx);
              CMDComprobante.Parameters.Add("?Fecha", MySqlDbType.Datetime);
              CMDComprobante.Parameters["?Fecha"].Value = DtFecha.Value;
              CMDComprobante.Parameters.Add("?Cliente", MySqlDbType.VarChar, 50, "Cliente");
              CMDComprobante.Parameters.Add("?Usuario", MySqlDbType.VarChar, 5, "Usuario");
              CMDComprobante.Parameters.Add("?Descripcion", MySqlDbType.VarChar, 100, "Descripcion");
              CMDComprobante.Parameters.Add("?NroCpte", MySqlDbType.Int32, 4, "NroCpte").SourceVersion = DataRowVersion.Original;
              SDAComprobante.UpdateCommand = CMDComprobante;
  
              //Inserta comprobante
              CMDComprobante = new MySqlCommand(strInsertComprobante(), Modulos.ClsGlobal.MyNetCnx);
              CMDComprobante.Parameters.Add("?Fecha", MySqlDbType.Datetime);
              CMDComprobante.Parameters["?Fecha"].Value = DtFecha.Value;
              CMDComprobante.Parameters.Add("?Cliente", MySqlDbType.VarChar, 50, "Cliente");
              CMDComprobante.Parameters.Add("?Usuario", MySqlDbType.VarChar, 5, "Usuario");
              CMDComprobante.Parameters.Add("?Descripcion", MySqlDbType.VarChar, 100, "Descripcion");
              CMDComprobante.Parameters.Add("?NroCpte", MySqlDbType.Int32, 4);
              CMDComprobante.Parameters["?NroCpte"].Value = intNroCpte;
              SDAComprobante.InsertCommand = CMDComprobante;
  
              DataTable UpdateComprobante;
              UpdateComprobante = dsData.Tables["Comprobante"].GetChanges(DataRowState.Modified);
              if (UpdateComprobante != null)
              {
                  intRowsAfects = SDAComprobante.Update(UpdateComprobante);
                  dsData.Tables["Comprobante"].AcceptChanges();
              }
  
              DataTable InsertComprobante;
              InsertComprobante = dsData.Tables["Comprobante"].GetChanges(DataRowState.Added);
              if (InsertComprobante != null)
              {
                  intRowsAfects = SDAComprobante.Update(InsertComprobante);
                  dsData.Tables["Comprobante"].AcceptChanges();
              }
  
              return intRowsAfects;
          }
          catch (MySqlException ex)
          {
              MessageBox.Show(ex.Message, "GrabarComprobante", MessageBoxButtons.OK, MessageBoxIcon.Information);
              return intRowsAfects;
          }
      }
  
      private int GrabarDetalle(long intNroCpte)
      {
          int intRowsAfects = 0;
          try
          {
              //Actualiza Detalle
              CMDDetalle = new MySqlCommand(strUpdateDetalle(), Modulos.ClsGlobal.MyNetCnx);
              CMDDetalle.Parameters.Add("?NroDetalle", MySqlDbType.Int32, 4, "NroDetalle");
              CMDDetalle.Parameters.Add("?Producto", MySqlDbType.VarChar, 10, "Producto");
              CMDDetalle.Parameters.Add("?CostoUnt", MySqlDbType.Decimal, 7, "CostoUnt");
              CMDDetalle.Parameters.Add("?PrecioUnt", MySqlDbType.Decimal, 2, "PrecioUnt");
              CMDDetalle.Parameters.Add("?Cantidad", MySqlDbType.Int32, 4, "Cantidad");
              CMDDetalle.Parameters.Add("?Descuento", MySqlDbType.Int32, 3, "Descuento");
              CMDDetalle.Parameters.Add("?Monto", MySqlDbType.Decimal, 2, "Monto");
              CMDDetalle.Parameters.Add("?NroCpte", MySqlDbType.Int32, 4, "NroCpte");
              SDADetalle.UpdateCommand = CMDDetalle;
  
              //Eliminar fila de Detalle
              CMDDetalle = new MySqlCommand(strDeleteDetalle(), Modulos.ClsGlobal.MyNetCnx);
              CMDDetalle.Parameters.Add("?NroCpte", MySqlDbType.Int32, 4, "NroCpte");
              CMDDetalle.Parameters.Add("?NroDetalle", MySqlDbType.Int32, 4, "NroDetalle");
              SDADetalle.DeleteCommand = CMDDetalle;
  
              //Insertar fila en Detalle
              CMDDetalle = new MySqlCommand(strInsertDetalle(), Modulos.ClsGlobal.MyNetCnx);
              CMDDetalle.Parameters.Add("?NroCpte", MySqlDbType.Int32, 4);
              CMDDetalle.Parameters["?NroCpte"].Value = intNroCpte;
              CMDDetalle.Parameters.Add("?NroDetalle", MySqlDbType.Int32, 4,"NroDetalle");
              CMDDetalle.Parameters.Add("?Producto", MySqlDbType.VarChar, 10, "Producto");
              CMDDetalle.Parameters.Add("?CostoUnt", MySqlDbType.Decimal, 7, "CostoUnt");
              CMDDetalle.Parameters.Add("?PrecioUnt", MySqlDbType.Decimal, 2, "PrecioUnt");
              CMDDetalle.Parameters.Add("?Cantidad", MySqlDbType.Int32, 4, "Cantidad");
              CMDDetalle.Parameters.Add("?Descuento", MySqlDbType.Int32, 3, "Descuento");
              CMDDetalle.Parameters.Add("?Monto", MySqlDbType.Decimal, 2, "Monto");
              SDADetalle.InsertCommand = CMDDetalle;
  
              DataTable ChangeRecordsDetalle;
              ChangeRecordsDetalle = dsData.Tables["Detalle"].GetChanges(DataRowState.Modified);
              if (ChangeRecordsDetalle != null)
              {
                  intRowsAfects = SDADetalle.Update(ChangeRecordsDetalle);
                  dsData.Tables["Detalle"].AcceptChanges();
              }
  
              DataTable DeleteRecordsDetalle;
              DeleteRecordsDetalle = dsData.Tables["Detalle"].GetChanges(DataRowState.Deleted);
              if (DeleteRecordsDetalle != null)
              {
                  intRowsAfects = SDADetalle.Update(DeleteRecordsDetalle);
                  dsData.Tables["Detalle"].AcceptChanges();
              }
  
              DataTable InsertRecordsDetalle;
              InsertRecordsDetalle = dsData.Tables["Detalle"].GetChanges(DataRowState.Added);
              if (InsertRecordsDetalle != null)
              {
                  intRowsAfects = SDADetalle.Update(InsertRecordsDetalle);
                  dsData.Tables["Detalle"].AcceptChanges();
              }
              return intRowsAfects;
          }
          catch (MySqlException ex)
          {
              MessageBox.Show(ex.Message, "GrabarDetalle", MessageBoxButtons.OK, MessageBoxIcon.Information);
              return intRowsAfects;
          }
      }
  
      private Boolean CrearDSRegSalida()
      {
          this.Cursor = Cursors.WaitCursor;
          MySqlCommand CMDComprobante;
          try
          {
              blnTodos = false;
              CMDComprobante = new MySqlCommand(strSelectComprobante(), Modulos.ClsGlobal.MyNetCnx);
              SDAComprobante = new MySqlDataAdapter();
              SDAComprobante.MissingSchemaAction = MissingSchemaAction.AddWithKey;
              SDAComprobante.SelectCommand = CMDComprobante;
              SDAComprobante.FillSchema(dtComprobante, SchemaType.Source);
              SDAComprobante.Fill(dtComprobante);
  
              SDADetalle = new MySqlDataAdapter(strSelectDetalle(), Modulos.ClsGlobal.MyNetCnx);
              SDADetalle.FillSchema(dtDetalle, SchemaType.Mapped);
              SDADetalle.Fill(dtDetalle);
  
              dsData.Tables.Add(dtComprobante);
              dsData.Tables.Add(dtDetalle);
  
              dtComprobante.PrimaryKey = new DataColumn[] { dtComprobante.Columns["NroCpte"] };
              dtDetalle.PrimaryKey = new DataColumn[] { dtDetalle.Columns["NroCpte"], dtDetalle.Columns["NroDetalle"] };
  
              //Create RelationShip Comprobante - Detalle                
              DataColumn parentColumn = new DataColumn();
              parentColumn = dsData.Tables["Comprobante"].Columns["NroCpte"];
              //parentColumn.AutoIncrement = true;
              //parentColumn.AutoIncrementSeed = 1;
              //parentColumn.AutoIncrementStep = 1;
              parentColumn.Unique = true;               
  
              DataColumn childColumn = new DataColumn();
              childColumn = dsData.Tables["Detalle"].Columns["NroCpte"];
              //childColumn.AutoIncrement = true;
              //childColumn.AutoIncrementSeed = 1;
              //childColumn.AutoIncrementStep = 1;
              childColumn.Unique = false;
  
              DataColumn childColumnKey = new DataColumn();
              childColumnKey = dsData.Tables["Detalle"].Columns["NroDetalle"];
              childColumnKey.AutoIncrement = true;
              childColumnKey.AutoIncrementSeed = 1;
              childColumnKey.AutoIncrementStep = 1;
              //childColumn.Unique = true;
  
              DataRelation relation = new DataRelation("REL_Cmpte_Detalle", parentColumn, childColumn, true);
  
              dsData.Relations.Add(relation);
  
              relation.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;
              relation.ChildKeyConstraint.DeleteRule = Rule.Cascade;
              relation.ChildKeyConstraint.UpdateRule = Rule.Cascade;
  
              //ForeignKeyConstraint fk = new ForeignKeyConstraint("ForeignKey", dsData.Tables["Comprobante"].Columns["NroCpte"], dsData.Tables["Detalle"].Columns["NroCpte"]);
              //ForeignKeyConstraint fk = new ForeignKeyConstraint("ForeignKey", parentColumn, childColumn);
              //fk.DeleteRule = Rule.Cascade;
              //fk.UpdateRule = Rule.Cascade;
              //dtDetalle.Constraints.Add(fk);
  
              //Create RelationShip Comprobante - controls forms                
              TxtNroCpte.DataBindings.Add(new Binding("Text", dsData.Tables["Comprobante"].DefaultView, "NroCpte"));
              CmbCliente.DataBindings.Add(new Binding("Text", dsData.Tables["Comprobante"].DefaultView, "Cliente"));
              TxtDescripcion.DataBindings.Add(new Binding("Text", dsData.Tables["Comprobante"].DefaultView, "Descripcion"));
              DtFecha.DataBindings.Add(new Binding("Value", dsData.Tables["Comprobante"].DefaultView, "Fecha"));
  
              DGVDetalle.DataSource = dsData.Tables["Detalle"].DefaultView;
              DGVDetalle.Columns[ColNroCpte.Index].DataPropertyName = "NroCpte";
              DGVDetalle.Columns[ColNroDetalle.Index].DataPropertyName = "NroDetalle";  
              DGVDetalle.Columns[ColProducto.Index].DataPropertyName = "Producto";
              DGVDetalle.Columns[ColDenominacion.Index].DataPropertyName = "Denominacion";
              DGVDetalle.Columns[ColUnidad.Index].DataPropertyName = "Unidad";
              DGVDetalle.Columns[ColCosto.Index].DataPropertyName = "CostoUnt";
              DGVDetalle.Columns[ColPrVenta.Index].DataPropertyName = "PrecioUnt";
              DGVDetalle.Columns[ColCantidad.Index].DataPropertyName = "Cantidad";
              DGVDetalle.Columns[ColDescuento.Index].DataPropertyName = "Descuento";
              DGVDetalle.Columns[ColMonto.Index].DataPropertyName = "Monto";
  
              //bindingmanager 
  
              BMBComprobante = this.BindingContext[dsData.Tables["Comprobante"].DefaultView];
              BMBComprobante.PositionChanged += new EventHandler(Binding_PositionChanged);
              dtComprobante.TableNewRow += new DataTableNewRowEventHandler(dtComprobante_NewRow);
              dtDetalle.TableNewRow += new DataTableNewRowEventHandler(dtDetalle_NewRow);
  
              this.Cursor = Cursors.Default;
              return true;
          }
          catch (Exception e)
          {
              MessageBox.Show(e.Message, "CrearDSRegSalida", MessageBoxButtons.OK, MessageBoxIcon.Error);
              this.Cursor = Cursors.Default;
              return false;
          }
      }
  
      private void Binding_PositionChanged(object sender, System.EventArgs e)
      {
          string filter;
          DataRow selectedRow;
  
  
          if (this.BindingContext[dsData.Tables["Comprobante"].DefaultView].Position &gt;= 0)
          {
              selectedRow = dtComprobante.Rows[this.BindingContext[dsData.Tables["Comprobante"].DefaultView].Position];
              strCurrentNroCpte = selectedRow["NroCpte"].ToString();
              filter = "NroCpte=" + strCurrentNroCpte;
              dsData.Tables["Detalle"].DefaultView.RowFilter = filter;
          }            
      }
  
      private void dtComprobante_NewRow(object sender, DataTableNewRowEventArgs e)
      {
  
          e.Row["TipoCpte"] = "S";
          e.Row["Fecha"] = DateTime.Now;
          e.Row["Usuario"] = Modulos.ClsGlobal.Usuario;
          e.Row["Descripcion"] = "nuevo";           
  
      }
  
      private void dtDetalle_NewRow(object sender, DataTableNewRowEventArgs e)
      {          
          if (strCurrentNroCpte.Trim().Length != 0)
          {
  
              Boolean result = long.TryParse(strCurrentNroCpte, out intNroCpte);                
              e.Row["NroCpte"] = intNroCpte;
              e.Row["TipoCpte"] = "S";
          }
      }
  
      private Boolean GrabarRegSalida()
      {
          int returnValue = 0;
          try
          {                
              BMBComprobante.EndCurrentEdit();                
              BMBDetalle.EndCurrentEdit();
              if (dsData.HasChanges())
              {
                  using (TransactionScope scope = new TransactionScope())
                  {
  
                          Modulos.ClsGlobal.MyNetCnx.Open();
                          if (blnNuevoCpte)
                          {
                              intNroCpte = objF.GetNumeroCpte("S");
                              returnValue = GrabarNroCpte(intNroCpte);
                          }
                          else
                              returnValue = 1;
  
                      returnValue = GrabarComprobante(intNroCpte);
  
                      returnValue += GrabarDetalle(intNroCpte);
  
                      scope.Complete();
                  }
                  Modulos.ClsGlobal.MyNetCnx.Close();
  
              }
              if (returnValue &gt; 0)
                  return true;
              else
                  return false;             
          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.Message, "GrabarRegSalida", MessageBoxButtons.OK, MessageBoxIcon.Information);
              Modulos.ClsGlobal.MyNetCnx.Close();
              return false;
          }       
      }
  
  
      private void DGVDetalle_Enter(object sender, EventArgs e)
      {
  
          this.BindingContext[dsData, "Comprobante"].EndCurrentEdit();
          //BMBComprobante.EndCurrentEdit();
          dsData.AcceptChanges();
  
          Boolean str = dtComprobante.HasErrors; 
  
      }
  </code></pre>
  
  <p>When I like to insert a new master row, then i have this error: ForeignKeyConstraint REL_Cmpte_Detalle requires the child key values (0) to exist in the parent table</p>
  
  <p>Please help me.</p>
  
  <p>THANKS, IN ADVANCE.</p>
  
  <p>--</p>
  
  <h2>--Definition of table <code>tbcomprobante</code></h2>
  
  <pre><code>DROP TABLE IF EXISTS `tbcomprobante`;
  
  CREATE TABLE `tbcomprobante` (
  
      `idTbComprobante` int(10) unsigned NOT NULL auto_increment,
  
      `NroCpte` int(10) unsigned NOT NULL,
  
      `TipoCpte` varchar(1) NOT NULL,
  
      `Factura` varchar(10) default NULL,
  
      `Fecha` datetime NOT NULL,
  
      `Proveedor` varchar(50) default NULL,
  
      `Cliente` varchar(50) default NULL,
  
      `Usuario` varchar(5) NOT NULL,
  
      `Descripcion` varchar(100) default NULL,
  
      PRIMARY KEY  USING BTREE (`idTbComprobante`)
  
      ) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1;
  </code></pre>
  
  <p>--</p>
  
  <h2>--Definition of table <code>tbdetalle</code></h2>
  
  <pre><code>DROP TABLE IF EXISTS `tbdetalle`;
  
  CREATE TABLE `tbdetalle` (
  
      `idTbDetalle` int(10) unsigned NOT NULL auto_increment,
  
      `NroCpte` int(10) unsigned NOT NULL,
  
      `Producto` varchar(10) NOT NULL,
  
      `Cantidad` int(10) unsigned NOT NULL default '0',
  
      `CostoUnt` decimal(10,7) default '0.0000000',
  
      `Monto` decimal(10,2) default '0.00',
  
      `TipoCpte` varchar(1) NOT NULL,
  
      `PrecioUnt` decimal(10,2) default '0.00',
  
      `Descuento` int(10) unsigned NOT NULL,
  
      `NroDetalle` int(10) unsigned NOT NULL,
  
      PRIMARY KEY  USING BTREE (`idTbDetalle`)
  
  ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1;
  </code></pre>