では使用できません:で実行されている他のスレッドがあるのでEF4.1 + MARS - 新しいトランザクション私は、データベース内のエンティティを更新していたときに、私は次の例外を取得していますUPDATE
新しいトランザクションは許可されていませんセッション。
同じコードブロックを使用して、すべての受信データを処理します(Excelワークブックからスクレイプされています)。ここで、また、
public void UploadWorkbook(Workbook workbook, string uploadedBy, string comments)
{
workbook.UploadedBy = uploadedBy;
workbook.Comments = comments;
var existing = _repository.Get(x => x.FileName == workbook.FileName);
if (existing == null)
_repository.Insert(workbook); // this works on the commit
else
_repository.Update(workbook); // this causes commit to fail
_unitOfWork.Commit(); // fails when repository runs update method
}
更新方法である:作業INSERTと動作しないUPDATEの唯一の違いは以下のとおりです。
:ここpublic override void Update(Workbook entity)
{
var existing = Get(x => x.FileName == entity.FileName);
if (existing == null)
{
var message = string.Format(@"Error :: Cannot update Workbook '{0}'
because it does not exist in the database.",
entity.FileName);
throw new Exception(message);
}
existing.Version = entity.Version;
existing.DateModified = DateTime.Now;
existing.Comments = entity.Comments;
existing.FilePath = entity.FilePath;
if (existing.Data != null)
existing.Data.Clear();
existing.Data = entity.Data;
}
は、Getメソッドの実装であります
public virtual T Get(Func<T, bool> where)
{
return _dbSet.Where(where).FirstOrDefault();
}
私は類似の問題に関して他のいくつかの記事を見てきましたが、私が経験しているものと全く同じものはありませんでした。私は本当にINSERTがどのように動作するのか分からないので、ここでは本当に立ち往生していますが、UPDATEは失敗します。別のトランザクションがあった場合、どちらのアクションも失敗するでしょうか?
どのようにあなたのコンテキスト/リポジトリ/セットの寿命を扱うのですか?同時に実行する操作の数はいくつですか? –
@LadislavMrnka私のコンテキストとリポジトリの有効期間はHTTP要求ごとであり、私は考えることができる並行操作はありません。私がMARSを有効にしている唯一の理由は、遅延データの読み込みとネストされたクエリの実行が、「既に開いているデータリーダーがある」という例外を避けるためです。 – shuniar