我已经使用Rob Conery对存储库模式的改进(来自MVC Storefront项目)实现了一个DAL,其中我使用Linq将数据库对象映射到域对象,并使用Linq to SQL实际获取数据。
这一切都非常出色,让我完全掌控了我想要的域对象的形状,但是我遇到了并发问题,我觉得我应该在这里提问。我已经解决了并发性问题,但解决方案感觉可能是错误的(只是那种让人不舒服的感觉)。
基本模式如下:
因为将任务映射到域任务,所以我失去了并发跟踪。通过存储私有Table(即我的数据上下文任务列表),我可以重新获得它。然后,我从这个存储的Table中更新任务并保存我已经更新的内容。这个方法行得通 - 当存在并发冲突时,我会像想要的那样收到更改冲突异常。但是,我感觉我错过了什么好方法。是否有更好的方法呢?我看过数据上下文的.Attach方法,但似乎需要以与我已经在做的方式类似的方式存储原始版本。我也知道,通过放弃域对象并让Linq to 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();
}
因为将任务映射到域任务,所以我失去了并发跟踪。通过存储私有Table(即我的数据上下文任务列表),我可以重新获得它。然后,我从这个存储的Table中更新任务并保存我已经更新的内容。这个方法行得通 - 当存在并发冲突时,我会像想要的那样收到更改冲突异常。但是,我感觉我错过了什么好方法。是否有更好的方法呢?我看过数据上下文的.Attach方法,但似乎需要以与我已经在做的方式类似的方式存储原始版本。我也知道,通过放弃域对象并让Linq to SQL生成的对象一路到达我的堆栈,我可以避免所有这些问题 - 但我同样不喜欢处理并发的方式。