Я работал над проектом, в котором команда решила разделить домен на четыре разных файла DBML. Основная причина такого скопления была связана с конструктором LINQ to SQL. Конструктор не предназначен для использования с большими доменами.
Эти четыре «поддомена» в этом проекте были достаточно разделены, но было некоторое совпадение, и это постоянно нас кусало. С этим опытом я бы посоветовал вам использовать один файл DBML на домен. Обычно у вас будет один домен на базу данных, так что это означает, что один файл DBML на базу данных.
Лично я против использования TransactionScope в рабочем коде (но я все время использую его для интеграционных тестов), но это другое обсуждение. Однако, если вы решили использовать несколько файлов DBML и использовать вариант использования, в котором вам нужно создать несколько классов DataContext, вы можете запустить их в одной транзакции следующим образом:
using (var con = new SqlConnection("constr"))
{
con.Open();
using (var tran = con.BeginTransaction())
{
using (var context = new CustomerDataContext(con))
{
// do some work with it
context.SubmitChanges();
}
using (var context = new VendorDataContext(con))
{
// do some work with it
context.SubmitChanges();
}
}
}
Это модель, которую я использую большую часть времени, даже с одним DataContext. Однако создание соединения и транзакции абстрагируются, поэтому в коде есть только одно место, где сделана транзакция.