Использование SubmitChanges для создания транзакции LINQ - PullRequest
3 голосов
/ 05 сентября 2011

Итак, я пытаюсь совершить транзакцию с помощью LINQ to SQL.Я прочитал, что если я использую SubmitChanges(), это создаст транзакцию и выполнит все, и в случае исключения все будет откатано.Нужно ли использовать MULTIPLE 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();

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Вы можете сделать все это сделкой, используя 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() выдается исключение, то все будет откатано.

1 голос
/ 05 сентября 2011

Проблема в том, что идентификатор вашего процесса устанавливается, когда изменения передаются в базу данных. Потому что вы отправляете изменения после строки, в которой вы назначаете идентификатор процесса для продукта (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.

...