none
Muchas dudas sobre insert de datos RRS feed

  • Pregunta

  • Hola despues de leer bastante sobre un bug sql campos identity donde tenia problemas de salto en la secuencia autonumerica me decidi a crear por código mi propio contador autonumérico este es el código de un ejemplo que utilizo para insertar datos de un listiew y uso esta parte por ser la única repetitiva

                                    

    foreach (ListViewItem item in listView1.Items)
                {
                    var Id_max = (from c in dbcontext.Tabla1

                                    select c).Max(c => c.Id);

                           Tabla1 tbl= new Tabla1();

                           tbl.Id = Id_max + 1;

                           dbcontext.Tabla1.Add(tbl);
                           dbcontext.SaveChanges();

             }

    Ahora las dudas aunque probado y funcionando el codigo no quiero chocar con sorpresas desagradables mas adelante 1-cual es la diferencia de poner el savechanges dentro del foreach o fuera porque probando ambos funcionan 2-Esta técnica es correcta o hay una mejor forma de hacerlo 3-En varios ejemplos veo que usan esta forma de grabar

    db.Orders.InsertOnSubmit(ord);
    db.SubmitChanges();

    Uso vs 2013 con update 4 EF 5 y sqlexpress 2012 y no me aparece en el intellisense esta forma de grabar solo el add y el savechanges cuales seria las diferencias entre add y insertonsubmit y por ultimo volviendo al bug sql que dejo link http://www.dfarber.com/computer-consulting-blog/2014/2/13/how-to-solve-identity-problem-in-sql-2012.aspx. Y apesar de hacer todo como dice ahi me sigue apareciendo el problema pensé en volver a sqlexpress 2008 o pasar a sqlexpress 2014 pero en este ultimo recurro a ustedes para aprovechar su experiencia y no encontrarme con problemas desde ya gracias.

    Me olvidaba aunque el campo Id no es importante en el funcionamiento de las aplicaciones la correcta correlatividad de ese campo es que se utiliza para auditarse que no se hagan cambios en la bd.  

    domingo, 8 de mayo de 2016 22:09

Todas las respuestas

  • Hola EnzoTuc40,

    Entiendo que InsertOnSubmit() es un método de LinQ to SQL, Add() es un método de LinQ to EF. Ambos métodos agregan la entidad al contexto del que subyacen con un estado "es espera", para el caso del método Add() marca la entidad con un estado Added hasta ejecutar el método SaveChanges() que es el "encargado" de persistir los datos en la base de datos.

    Respecto al bug que refieres, no es tal, es el comportamiento normal que tiene la propiedad IDENTITY() y que sucede por registros eliminados, transacciones no concluidas, etc. La propiedad IDENTITY() no asegura ni unicidad ni valores secuenciales, aún cuando seas tu quien gestione la secuencia igual se darán los gaps cuando hayan registros eliminados en el medio de la secuencia.

    El problema de gestionar por cuenta propia la secuencia es que no basta con un simple MAX() a la tabla, el tema va mucho mas allá donde no sólo deberás reforzar la unicidad sino deberás cuidar los bloqueos para garantizar las operaciones con usuarios concurrentes.

    Finalmente, concluyo igual que tú en que la secuencia como valor de clave no tiene mas objetivo que el de sostener la unicidad, sin embargo, me queda la duda cuando mencionas que haces uso de ese valor para auditorias, ¿qué tipo de auditoria refiere a un valor autogenerado?

    domingo, 8 de mayo de 2016 23:55
  • Hola williams gracias por tu aporte. En cuanto a la auditoria es largo de explicar pero como resumen si la numeración es 1-2-3-4-5-6-7 etc. todos felices en cambio 1-2-5-9-1020-3012 largas horas de explicación. y gracias de nuevo en cuanto a la versión 2014 ya la probaste ?
    lunes, 9 de mayo de 2016 14:10
  • EnzoTuc40,

    ¿Y como harás la excepción -en la auditoria- para los casos en que los gaps se produzcan porque eliminaste algún registro? ¿La tabla o el proceso no permite que se borren filas?

    Te sugiero que revises SEQUENCE.

    lunes, 9 de mayo de 2016 14:25
  • Hola Williams, en cuanto a tu pregunta no se pueden borrar registros de la tabla por eso cuando hay saltos debo ir a dar explicaciones
    lunes, 9 de mayo de 2016 16:20
  • EnzoTuc40,

    Creo que aquí ya empezamos a discrepar, si la regla es que se restringa la eliminación de filas de alguna o todas las tablas entonces ¿no crees que esto es una restricción de permisos de usuario respecto a la(s) tabla(s)?. El usuario que se conecta a la base de datos debería tener los permisos restringidos para evitar este tipo de situaciones.

    lunes, 9 de mayo de 2016 16:39
  • hola

    >>1-cual es la diferencia de poner el savechanges dentro del foreach o fuera porque probando ambos funcionan

    Ponerla la operacion fuera del for realiza una sola operacion contra la db realizando todos las operaciones de insert

    En lugar de enviar una a una las operaciones

    >>no me aparece en el intellisense esta forma de grabar solo el add y el savechanges cuales seria las diferencias entre add y insertonsubmit

    Entiendo que el insertonsubmit es de linq to sql, no aplica con entity framework

    >>despues de leer bastante sobre un bug sql campos identity donde tenia problemas de salto en la secuencia autonumerica

    Yo no veo ningun bug, los campos identity dejan huecos en la secuencia si es que eliminas registros de en medio

    quizas podrias hacer que los registros no se eliminen fisicamente, sino que sea un borrado logico (defines un campo bool de estado indicando que esta eliminado), de esta forma no tendrias ningun hueco y se secuencia seria consecutiva

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de mayo de 2016 17:24
  • Estimado Leandro,

    La propiedad IDENTITY en ningún caso garantiza la secuencia, incluso si evitas eliminar registros la secuencia podría alterarse en caso se revierta una operación de inserción, se reinicie el servidor, etc.

    lunes, 9 de mayo de 2016 21:41