我已经使用 Rob Conery 对存储库模式(来自 MVC Storefront 项目)的旋转实现了一个 DAL,其中我使用 Linq 将数据库对象映射到域对象,并使用 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();
}
因此,通过该实现,由于映射到域任务,我失去了并发跟踪。我通过存储私有表来取回它,这是我在获取原始任务时的任务数据上下文列表。
然后我从这个存储的表中更新任务并保存我更新的内容
这是有效的 - 当存在并发冲突时,我会收到更改冲突异常,就像我想要的那样。
然而,它只是对我尖叫,我错过了一个把戏。
有没有更好的方法来做到这一点?
我已经查看了 datacontext 上的 .Attach 方法,但这似乎需要以与我已经在做的类似的方式存储原始版本。
我也知道我可以通过取消域对象并让 Linq to SQL 生成的对象一直在我的堆栈中来避免这一切——但我不喜欢这一点,就像我不喜欢我处理并发的方式一样。