Вопрос

Итак, я пытаюсь совершить транзакцию с 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() тогда называется все это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top