リポジトリ パターン (MVC Storefront プロジェクトから) で Rob Conery のスピンを使用して DAL を実装しました。ここでは、Linq を使用してデータベース オブジェクトをドメイン オブジェクトにマップし、Linq to SQL を使用して実際にデータを取得します。
これはすべて素晴らしく機能しており、必要なドメイン オブジェクトの形状を完全に制御できますが、ここで質問したいと思っていた同時実行性の問題にぶつかりました。私は並行処理を行っていますが、解決策は間違っているように感じます (これらのぎこちない感情の 1 つにすぎません)。
基本的なパターンは次のとおりです。
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 で生成されたオブジェクトをスタックのずっと上に置くことで、これをすべて回避できることも知っていますが、同時実行の処理方法が嫌いなのと同じくらい嫌いです。