Как получить инструкции вставки без использования SubmitChanges в LINQPad - PullRequest
1 голос
/ 01 декабря 2011

У меня есть что-то похожее на код ниже в LINQPAD с использованием операторов C #. Моя цель состоит в том, чтобы получить фактические инструкции SQL Insert, а не обновить базу данных.

Я могу легко удалить данные после их вставки с этим небольшим образцом, но мне это понадобится для большего объема данных. Я надеюсь, что упустил что-то простое в L2S или LINQPad.

Есть ли более простой способ получить вставку SQL?

var e1 = new MyEntity(){ Text = "First" };
var e2 = new MyEntity(){ Text = "Second" };

MyEntities.InsertOnSubmit(e1);
MyEntities.InsertOnSubmit(e2);

SubmitChanges();

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Быстрый способ - обернуть все в область транзакции, которая никогда не фиксируется:

using(TransactionScope ts = new TransactionScope())
{
  var e1 = new MyEntity(){ Text = "First" };
  var e2 = new MyEntity(){ Text = "Second" };

  MyEntities.InsertOnSubmit(e1);
  MyEntities.InsertOnSubmit(e2);

  SubmitChanges();

  // Deliberately not committing the transaction.
}

Это хорошо работает для небольших томов.Если объем данных большой, а в базе данных используется модель полного восстановления, рост журнала транзакций может стать проблемой.

1 голос
/ 02 декабря 2011

Когда мы делали образцы для «LINQ в действии», мы использовали следующий метод, который получает запланированные изменения из контекста:

public String GetChangeText(System.Data.Linq.DataContext context)
    {
      MethodInfo mi = typeof(DataContext).GetMethod("GetChangeText", 
                             BindingFlags.NonPublic | BindingFlags.Instance);
      return mi.Invoke(context, null).ToString();
    }

Если вы хотите увидеть это в действии, загрузите образцыв LINQPad (см. http://www.thinqlinq.com/Default/LINQ-In-Action-Samples-available-in-LINQPad.aspx) и ознакомьтесь с главой 6, пример 6.29.

...