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();
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top