Для этой транзакции вам не нужно совершать 2 и более обходов. Я считаю, что LINQ-DataContext разумно распознает, что эти файлы принадлежат объекту папки, и сначала вставит строку папки, а затем файлы (все в контексте транзакции, например, BEGIN TRAN / COMMIT). Однако вам нужно сделать:
dc.Files.InsertOnSubmit(
new File { Filename = filename, Folder = folder });
вместо FolderId. Примерно так:
public class TestBL
{
public static void AddFolder(string folderName)
{
using (var ts = new TransactionScope())
{
using (var dc = new TestDataContext())
{
var folder = new Folder { FolderName = folderName };
AddFile(dc, "test1.xyz", folder);
AddFile(dc, "test2.xyz", folder);
AddFile(dc, "test3.xyz", folder);
dc.SubmitChanges();
}
ts.Complete();
}
}
private static void AddFile(DataContext dc, string filename, Folder folder)
{
dc.Files.InsertOnSubmit(
new File { Filename = filename, Folder = folder });
}
public static void AddFile(string filename, int folderId)
{
using (var dc = new TestDataContext())
{
var folder = new Folder { FolderId = folderId };
dc.Attach(folder, false);
AddFile(dc, filename, folder);
dc.SubmitChanges();
}
}
}
На ваш вопрос относительно DTC: я не думаю, что здесь можно избежать DTC из-за 2 открытых соединений. Я полагаю, что они недавно внесли некоторые изменения в эту область, см. здесь , но описанный здесь сценарий немного отличается (2 подключения открываются и закрываются одно за другим, в отличие от 2 открытых одновременно).