Uso de submitchanges para crear una transacción LINQ
-
26-10-2019 - |
Pregunta
Entonces, estoy tratando de hacer una transacción con Linq a SQL. Leí que si uso SubmitChanges()
, crearía una transacción y ejecutaría todo y, en caso de una excepción, todo se volvería a rodar. ¿Necesito usar múltiples? SubmitChanges()
? Estoy usando algo como este código y no funciona porque no está guardando ningún dato en la primera tabla ... (Necesito su identificación para la tabla de niños).
Si uso otro SubmitChanges()
Justo después del primero InsertOnSubmit
¿No pierde la idea de una transacción?
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
//Set to insert
db.Process.InsertOnSubmit(openProcess);
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;
//Submit all changes at once?
db.SubmitChanges();
Solución
El problema es que la identificación de su proceso se establece cuando los cambios se envían a la base de datos. Porque envía los cambios después de la línea donde asigna el ID de proceso al producto (product.Process_Id = openProcess.Id;
).
La forma correcta de hacerlo sería configurar correctamente su base de datos con una clave externa del producto al proceso y usar la propiedad de navegación Process
en Product
para asignar el proceso al producto.
El código se vería así:
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process = openProcess;
db.Product.InsertOnSubmit(product);
db.SubmitChanges();
Porque Process
es una propiedad de navegación de Product
, no necesita insertar el Process
. Se insertará automáticamente, porque inserta el "padre" - el Product
.
Otros consejos
Puedes hacer todo el asunto transaciotnal usando un TransactionScope
p.ej
using (TransactionScope scope = new TransactionScope())
{
myDataContext db = new myDataContext();
Process openProcess = new Process();
openProcess.Creation = DateTime.Now;
openProcess.Number = pNumber;
db.Process.InsertOnSubmit(openProcess);
db.SubmitChanges();
//openProcess.Id will be populated
Product product = new Product();
product.Code = pCode;
product.Name = pName;
product.Process_Id = openProcess.Id;
db.Products.InsertOnSubmit(product); // I assume you missed this step in your example
db.SubmitChanges();
scope.Complete()
}
Si se lanza una excepción antes scope.Complete()
Se llama, entonces todo se volverá hacia atrás.