Linq для SQL нескольких контекста данных в одной транзакции
Я работаю над проектом, в котором у меня есть несколько репозиториев для извлечения данных из разных таблиц. Все мои репозитории независимы, они создают новый dataContext, добавляют строку в таблицу и применяют команду отправки изменений. Теперь, если в моем сервисе, есть ситуация, когда мне нужно вставить данные в несколько таблиц, но это должно произойти за одну транзакцию. Я могу добиться этого с помощью TrnasctionScope, но для этого нужен тот же dataContext. Поскольку я использую StrucutreMap для создания своих объектов, я не могу получить тот же контекст данных, поэтому моя транзакция не удалась.
Вот как мои объекты.
interface IConnection
{
MyDataContext GetContext();
}
public class Connection : IConnection
{
public MyDataContext GetContext()
{
return new MyDataContext();
}
}
interface IRepositryA
{
int SaveDataA(objectA a);
}
public class RepositoryA : IRepositryA
{
public int SaveDataA(objectA a)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableA.InsertOnSubmit(a);
context.SubmitChanges();
return a.ID;
}
}
interface IRepositryB
{
int SaveDataA(objectB b);
}
public class RepositoryA : IRepositryB
{
public int SaveDataB(objectB b)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableB.InsertOnSubmit(b);
context.SubmitChanges();
return b.ID;
}
}
Теперь в моем слое обслуживания я называю их как
public MyServiceClass ()
{
public SaveAll(ObjectA a, ObjectB b)
{
using (TransactionScope trn);
{
ObjectFactory.GetInstance<IRepositryA>().SaveDataA(a);
b.FkeyID = a.ID;
ObjectFactory.GetInstance<IRepositryB>().SaveDataB(b);
trn.complete();
}
}
}
Как я передам один и тот же контекст данных в два разных репозитория. Я подумал, что в каждом репозитории создается один перегруженный метод, который принимает параметр IDataContext, как указано ниже.
interface IRepositryA
{
int SaveDataA(objectA a);
int SaveDataA(IConnection connection, objectA a);
}
public class RepositoryA : IRepositryA
{
public int SaveDataA(objectA a)
{
var connection = objectFactory.GetInstance<IConnection>();
return SaveData(connection, a);
}
public int SaveDataA(IConnection connection, objectA a)
{
var context = connection.GetContext();
context.TableA.InsertOnSubmit(a);
context.SubmitChanges();
return a.ID;
}
}
interface IRepositryB
{
int SaveDataA(objectB b);
int SaveDataA(IConnection connection, objectB b);
}
public class RepositoryA : IRepositryB
{
public int SaveDataB(objectB b)
{
var connection = objectFactory.GetInstance<IConnection>();
return SaveData(connection, b);
}
public int SaveDataA(IConnection connection, objectB b)
{
var context = connection.GetContext();
context.TableB.InsertOnSubmit(b);
context.SubmitChanges();
return b.ID;
}
}
и на моем уровне обслуживания, я бы реализовать его как
public MyServiceClass ()
{
public SaveAll(ObjectA a, ObjectB b)
{
IConnection connection= ObjectFactory.GetInstance<IConnection>();
using (TransactionScope trn);
{
ObjectFactory.GetInstance<IRepositryA>().SaveDataA(connection,a);
b.FkeyID = a.ID;
ObjectFactory.GetInstance<IRepositryB>().SaveDataB(connection,b);
trn.complete();
}
}
}
Вторая мысль, которая у меня возникла: если я каким-то образом смогу настроить DataContext для возврата того же соединения, когда я вызываю метод GetContext поэтому все репозитории будут использовать одно и то же соединение. Но я чувствую, что это будет поддерживать связь постоянно. Я хочу, чтобы это соединение было доступно только во время использования этого метода SaveAll.
Ваша помощь будет оценена. Заранее спасибо.
Приветствия Парминдер