Я реализовал DAL, используя вращение Роба Конери на шаблоне хранилища (из проекта MVC Storefront), где я сопоставляю объекты базы данных с объектами домена с помощью Linq и использую Linq для SQL, чтобы фактически получить данные.
Все это прекрасно работает, давая мне полный контроль над формой моих доменных объектов, которые я хочу, но у меня возникла проблема с параллелизмом, о которой я подумал, я бы хотел спросить здесь. У меня работает параллелизм, но решение кажется, что оно может быть неправильным (только одно из этих неприятных ощущений).
Основной шаблон:
private MyDataContext _datacontext
private Table _tasks;
public Repository(MyDataContext datacontext)
{
_dataContext = datacontext;
}
public void GetTasks()
{
_tasks = from t in _dataContext.Tasks;
return from t in _tasks
select new Domain.Task
{
Name = t.Name,
Id = t.TaskId,
Description = t.Description
};
}
public void SaveTask(Domain.Task task)
{
Task dbTask = null;
// Logic for new tasks omitted...
dbTask = (from t in _tasks
where t.TaskId == task.Id
select t).SingleOrDefault();
dbTask.Description = task.Description,
dbTask.Name = task.Name,
_dataContext.SubmitChanges();
}
Итак, с этой реализацией я потерял параллельное отслеживание из-за сопоставления с задачей домена. Я получаю его обратно, сохраняя личную таблицу, которая является моим списком задач в текстовом формате во время получения исходной задачи.
Затем я обновляю задачи из этой сохраненной таблицы и сохраняю то, что обновил
Это работает - я получаю исключения конфликтов изменений, когда возникают нарушения параллелизма, как я хочу.
Однако мне просто кричит, что я пропустил трюк.
Есть ли лучший способ сделать это?
Я посмотрел на метод .Attach в текстовом тексте, но, похоже, для этого требуется сохранение исходной версии аналогично тому, что я уже делаю.
Я также знаю, что я мог бы избежать всего этого, покончив с объектами домена и позволяя сгенерированным Linq to SQL объектам полностью подниматься по моему стеку - но мне это не нравится так же, как и то, как я обрабатываю параллелизм.