none
Ayuda!!!! ¿Como registrar un ID automaticamente sin ingresar o seleccionar un dato en un Formulario? en C# y entity framework RRS feed

  • Pregunta

  • Buen dia 

    Tengo dos tablas relacionadas una de Clasificacion y otra de Registros.

    Mi conexión con la base de datos:

    AdminDispositivosEntities con = new AdminDispositivosEntities();

    agrege una variable miembro que apunta a mi tabla Registros

    Registros m_registro;

    Y ingresos los datos de mi formulario de la siguiente manera:

            private void btnGuardar_Click(object sender, EventArgs e)
            {
                    m_registro = new Registros();
                    m_registro.No_serie = txtNumeroSerie.Text;
                    m_registro.Modelo = txtModelo.Text;
                    m_registro.Nombre_red = txtNombreRed.Text;
                    con.Registros.Add(m_registro);
                    con.SaveChanges();
                    MessageBox.Show("Datos ingresados correctamente");
            }

    Ahi me falta ingresar m_registro.ID_Clasificacion como le puedo hacer para darle el ID automaticamente.

    por ejemplo m_registro.ID_Clasificacion = 1; y que se registre ese 1 en mi tabla Registros de la columna ID_Clasificacion.

    Saludos y feliz año nuevo.


    JavierLg12

    sábado, 30 de diciembre de 2017 15:43

Respuestas

  • Que tal Willams Morales saludos

    en los eventos click de agregar antena o terminal me abre un solo formulario de registro para ambos. En agregar antena llamo el form2 porque en este ingreso una posicion en una imagen "mapa" (picturebox) la antena (picturebox). Y el form3 pasa directamente al formulario de registro

    El parametro true o false lo utilizo de la siguiente manera

    public Form2(bool sel)
            {
                InitializeComponent();
                m_sel = sel;
                label1.Text = m_sel == true ? "AGREGAR ANTENA" : "AGREGAR TERMINAL" ;
    btnGuardar.Text = m_sel == true ? "Guardar antena" : "Guardar terminal";
                if (m_sel == true) // ANTENAS
                {
                    cbClasificacion.Visible = true;
                    cbSelecNombreRed.Visible = false;
                }
                else // TERMINALES
                {
                    cbClasificacion.Visible = true;
                    txtNombreRed.Visible = false;
                }
            }


    JavierLg12

    domingo, 31 de diciembre de 2017 4:34

Todas las respuestas

  • Debería funcionar por sí solo. Si en la base de datos has declarado el campo ID_Clasificacíon como IDENTITY para que autogenere sus valores, entonces al generar el modelo de entidades la correspondiente propiedad habrá sido marcada como "Generada desde base de datos". Y entonces no tienes que poner nada: simplemente lo dejas como lo tienes ahora, y después de SaveChanges verás que en la base de datos el campo ha quedado grabado con el siguiente valor.

    Importante: lo que te he dicho de marcarlo como IDENTITY y que la propiedad tenga el oportuno atributo es imprescindible, de lo contrario no funcionará lo indicado en el párrafo anterior.

    sábado, 30 de diciembre de 2017 17:32
  • Buen dia Alberto 

    Lo que pasa es que el ID_Clasificacion es una llave foranea de mi tabla Registros en lo que quisiera es que al guardar el registro me guarde el ID 1 o el ID 2 esto dependiendo del tipo de registro que hare.

    el ID 1 corresponde a la clasificacion de una ANTENA 

    el ID 2 corresponde a la clasificacion de una TERMINAL

    entonces ahi tengo que crear una funcion de agregarAntena y una de agregarTerminal porque en mi ejercicio lo tengo directamente en el evento click y la finalidad es que al hacer click en el boton de agregar registro sea dependiendo de lo que vaya a registrar, ya que tengo un solo formulario de registro para antena y terminal.

    En un menu de mi formulario Principal mando llamar a mi formulario de registro:

    private void agregarAntenaToolStripMenuItem_Click(object sender, EventArgs e) { //agregarAntena(); Form3 dlg = new Form3(true); dlg.ShowDialog(); }

            private void agregarTerminalToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Form2 dlg = new Form2(false);
                dlg.ShowDialog();
            }



    JavierLg12

    sábado, 30 de diciembre de 2017 18:31
  • Me temo que no se ha entendido nada. Podrías poner un diagrama de las dos tablas (o el SQL que las crea) para que veamos cómo se relacionan, y poner un ejemplo de qué valores se insertarían en ellas y en qué orden.
    sábado, 30 de diciembre de 2017 20:55
  • Hola

    Siendo este diagrama una aproximación a lo que tienes como contexto

    Ahí veo dos entidades una Clasificación y otra Registros las cuales tienen una relación de uno a muchos, en la cual la entidad Registros consume información de la entidad Clasificación. ¿Qué quiere decir esto?, que los Registros son clasificados por Antena y Terminal, para que esto suceda tienes que tener listo el mantenimiento de Clasificación con los registros Antena y Terminal.

    Cuando hagas el mantenimiento de Registros, quiero decir cuando des de alta un registro ahí es donde vas a seleccionar Antena o Terminal para eso puedes valerte de un objeto ComboBox para poder elegir uno de ellos. Al crear el nuevo registro tu gestor de base de datos se encargara de agregar el Id a tu tabla registros, para eso has debido poner tu campo Id en autonumerico para que el gestor de base de datos tenga la libertad de hacerlo, así como te explica @Alberto.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    sábado, 30 de diciembre de 2017 21:58
  • exacto Pedro Ávila el diagrama ej. es correcto, lo que me propones es una opcion, se podria hacer una seleccion automatica que quiero decir con automatica que el combo muestre el ID_Clasificacion = 1, Nombre = ANTENA

    habrá una forma de que mande seleccionar cuando invoco los eventos agregarAntenaToolStripMenuItem_Click o el evento agregarTerminalToolStripMenuItem_Click.

    si selecciona este ultimo sea ID_Clasificacion = 2, Nombre = TERMINAL

     


    JavierLg12

    domingo, 31 de diciembre de 2017 0:02
  • Hola

    Podrías usar comboBox1.SelectedIndex =1; comboBox1.SelectedIndex = 2 en cada evento

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    domingo, 31 de diciembre de 2017 0:28
  • ...en mi ejercicio lo tengo directamente en el evento click y la finalidad es que al hacer click en el botón de agregar registro sea dependiendo de lo que vaya a registrar, ya que tengo un solo formulario de registro para antena y terminal.

    En el código que adjuntas se puede observar que según el objeto que haya producido el evento Click se abre un formulario distinto, presupongo que equivocaste en la transcripción del código porque mencionas que se trata de un sólo formulario el que realiza la operación de persistencia.

    También se puede observar que has sobrecargado el constructor de la clase Form2/Form3 con un parámetro de tipo Boolean, ¿por qué no agregas un nuevo parámetro que determine el tipo de registro que se va a insertar?. Así mismo, considera realizar una consulta para recuperar el valor de identificación según el tipo de registro, escribir "en duro" los valores 1 o 2 puede traerte problemas posteriormente en caso los valores cambien.

    domingo, 31 de diciembre de 2017 2:55
  • Que tal Willams Morales saludos

    en los eventos click de agregar antena o terminal me abre un solo formulario de registro para ambos. En agregar antena llamo el form2 porque en este ingreso una posicion en una imagen "mapa" (picturebox) la antena (picturebox). Y el form3 pasa directamente al formulario de registro

    El parametro true o false lo utilizo de la siguiente manera

    public Form2(bool sel)
            {
                InitializeComponent();
                m_sel = sel;
                label1.Text = m_sel == true ? "AGREGAR ANTENA" : "AGREGAR TERMINAL" ;
    btnGuardar.Text = m_sel == true ? "Guardar antena" : "Guardar terminal";
                if (m_sel == true) // ANTENAS
                {
                    cbClasificacion.Visible = true;
                    cbSelecNombreRed.Visible = false;
                }
                else // TERMINALES
                {
                    cbClasificacion.Visible = true;
                    txtNombreRed.Visible = false;
                }
            }


    JavierLg12

    domingo, 31 de diciembre de 2017 4:34