Использование субчичков для создания транзакции LINQ
-
26-10-2019 - |
Вопрос
Итак, я пытаюсь совершить транзакцию с Linq в SQL. Я читаю это, если я использую SubmitChanges()
, Это создаст транзакцию и выполнит все, и в случае исключения все будет откачено. Мне нужно использовать несколько SubmitChanges()
? Я использую что -то вроде этого кода, и он не работает, потому что он не сохраняет какие -либо данные в первой таблице .. (Мне нужен идентификатор для детской таблицы).
Если я использую другой SubmitChanges()
сразу после первого InsertOnSubmit
Разве это не теряет идею транзакции?
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();
Решение
Проблема в том, что идентификатор вашего процесса устанавливается, когда изменения отправляются в базу данных. Потому что вы отправляете изменения после линии, где вы назначаете идентификатор процесса продукту (product.Process_Id = openProcess.Id;
).
Правильный способ сделать это - правильно настроить базу данных иностранным ключом от продукта для обработки и использования свойства навигации Process
на Product
назначить процесс продукту.
Код будет выглядеть так:
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();
Потому что Process
это навигационная собственность Product
, вам не нужно вставлять Process
. Анкет Он будет вставлен автоматически, потому что вы вставляете «родитель» - Product
.
Другие советы
Вы можете сделать все это трансациотарский, используя TransactionScope
например
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()
}
Если исключение брошено раньше scope.Complete()
тогда называется все это.