-1

下面的代码用于向数据库添加一行或更新已经存在的行。

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 上下文是每个连续请求中的不同对象。有没有办法在执行操作时锁定数据库表,或者如果刚刚发出相同的请求,则阻止操作执行数据库更新?

4

2 回答 2

0

如果您怀疑这是由于多次提交单击按钮造成的,那么您可以采取各种步骤来阻止这种情况,例如在按钮被激活后立即禁用它。您还应该进行一些服务器端检查,以确保没有通过多个请求。

于 2013-09-10T13:05:25.600 回答
0

我终于设法做到了这一点System.Transactions(我必须添加一个新的引用来访问它)。我的最后一个片段是 -

IEnumerable<Guid> fieldIds = glen.ComplianceField.Select(field => field.id);
ComplianceData data;
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable}))
        {
            foreach (Guid fieldId in fieldIds)
            {
                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();
            scope.Complete();
        }

部分感谢这个答案https://stackoverflow.com/a/13097278/1173776

于 2013-09-16T13:59:28.960 回答