Вы можете использовать System.Transactions.TransactionScope
для выполнения всего этого в атомарной транзакции, но если вы используете разные экземпляры DataContext
, это приведет к распределенной транзакции, что, вероятно, не то, что вы действительно хотите.
Судя по всему, вы не совсем правильно реализуете шаблон репозитория. Репозиторий не должен создавать свой собственный DataContext
(или объект соединения, или что-либо еще) - эти зависимости должны передаваться через конструктор или открытое свойство. Если вы сделаете это, у вас не возникнет проблем с разделением DataContext
:
public class UserRepository
{
private MyDataContext context;
public UserRepository(MyDataContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this.context = context;
}
public void Save(User user) { ... }
}
Используйте тот же шаблон для ClubMemberRepository
(или как вы его называете), и это становится тривиальным:
using (MyDataContext context = new MyDataContext())
{
UserRepository userRep = new UserRepository(context);
userRep.Save(user);
ClubMemberRepository memberRep = new ClubMemberRepository(context);
memberRep.Save(member);
context.SubmitChanges();
}
Конечно, даже этот немного ненадежен. Если у вас есть внешний ключ в вашей базе данных, вам даже не понадобятся два репозитория, потому что Linq to SQL управляет отношениями. Код для создания должен просто выглядеть следующим образом:
using (MyDataContext context = new MyDataContext())
{
User user = new User();
user.Name = "Bob";
user.ClubMember = new ClubMember();
user.ClubMember.Club = "Studio 54";
UserRepository userRep = new UserRepository(context);
userRep.Save(user);
context.SubmitChanges();
}
Не возитесь с несколькими репозиториями - пусть Linq to SQL обрабатывает отношения для вас, для этого и нужны ORM.