以下のコードは、データベースに行を追加するか、既存の行を更新するために使用されます。
IEnumerable<Guid> fieldIds = glen.ComplianceField.Select(field => field.id);
ComplianceData data;
foreach (Guid fieldId in fieldIds)
{
if (!checkEntity(fieldId, Extra.grn))
{
if (collection[fieldId.ToString()] != null)
{
if (glen.ComplianceData.Where(compData => (compData.fieldId == fieldId) && (compData.grn == Extra.grn)).Count() == 0)
{
data = new ComplianceData();
glen.ComplianceData.Add(data);
}
else
data = glen.ComplianceData.First(compData => (compData.fieldId == fieldId) && (compData.grn == Extra.grn));
data.fieldId = fieldId;
data.grn = Extra.grn;
data.value = collection[fieldId.ToString()];
}
}
}
glen.SaveChanges();
ただし、場合によっては (ユーザーが送信ボタンを複数回クリックしたと思われます)、データベース内で行が複製されます (サーバーが特に遅い場合は複数回)。この問題は、エントリを最初に作成したときにのみ発生し、その後、最初のエントリが期待どおりに更新されます。
コンテキストの ChangeTracker プロパティを使用しようとしましたが、glen コンテキストは連続する各リクエストで異なるオブジェクトであるため、うまくいきません。アクションの実行中にデータベース テーブルをロックする方法、または同じ要求が行われたばかりの場合にアクションがデータベースの更新を実行しないようにする方法はありますか?