LINQ to SQL несколько коммитов, как мне реализовать транзакции? - PullRequest
0 голосов
/ 24 августа 2011

У меня есть следующие две таблицы

Таблица 1: PK (int) TotalCount (int)

Таблица 2: PK (int) FK (int) (связь с PK в таблице 1) Count

Я вставляю запись в первую таблицу, чтобы получить PK. Затем, когда я собираю данные из источника и помещаю их в таблицу 2, я заполняю FK PK из предыдущей таблицы.

Я хотел бы внедрить транзакции в мой код. Как я смогу откатить таблицу 1, если вставка в таблицу 2 завершится неудачно, так как по таблице 1 уже выдан коммит?

Я написал небольшой код, чтобы проиллюстрировать, что я делаю

using (DeviceDataContext context = new DeviceDataContext())
{
     tgdd = new Data();
     context.Datas.InsertOnSubmit(tgdd);
     context.SubmitChanges();

     int pk = tgdd.PK;

     int count = 0;
     foreach (…)
     {
          count += 1;
          tgd = new Data2();
          tgd.FK = pk;
          tgd.count = count;
          context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                               //back what happened to table 1(Datas)
     }

}

Я написал этот код быстро, поэтому, если есть логические ошибки, пожалуйста, игнорируйте.

Значит, транзакции помогут мне сделать то, что я хочу?

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Обычно у вас должно быть свойство навигации в Data2, которое вы можете установить для своего экземпляра Data1:

 tgdd = new Data();
 context.Datas.InsertOnSubmit(tgdd);

 int count = 0;
 foreach (…)
 {
      count += 1;
      tgd = new Data2();
      tgd.Tgdd = tgdd;
      tgd.count = count;
      context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                           //back what happened to table 1(Datas)
 }

 context.SubmitChanges();

Таким образом, это можно сделать не только в одной области транзакции, но и в одной базе данных.туда и обратно.

Если вы не можете сделать это, используя свойство навигации, то использование TransactionScope является следующей лучшей вещью.

2 голосов
/ 24 августа 2011

Оберните ваше «using (DeviceDataContext context = new DeviceDataContext ())» в TransactionScope:

using (var ts = new TransactionScope())
using (DeviceDataContext context = new DeviceDataContext())
{
   tgdd = new Data();
     context.Datas.InsertOnSubmit(tgdd);
     context.SubmitChanges();

     int pk = tgdd.PK;

     int count = 0;
     foreach (…)
     {
          count += 1;
          tgd = new Data2();
          tgd.FK = pk;
          tgd.count = count;
          context.Datas2.InsertOnSubmit(tgd);  //if this crashes, I want to roll
                                               //back what happened to table 1(Datas)
     }
   ts.Complete();
}

Если не удается выполнить InsertOnSubmt, транзакция будет автоматически отменена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...