提问人:rientelfon 提问时间:10/27/2023 最后编辑:marc_srientelfon 更新时间:10/27/2023 访问量:56
ASP.NET MVC 与 Entity Framework 6.4 插入随机重复项
ASP.NET MVC with Entity Framework 6.4 Inserting Random Duplicates
问:
我遇到了一个问题,即使用 ASP.NET MVC 4 和 .NET Framework 4.8 的 Entity Framework 6.4.8 将随机插入重复记录 (2-5)。
附件是我的代码的缩写版本,分解为所有多个基本组件。
执行处理答案和保存的过程,这是一次保存所有内容,因此每个答案应该只有 1 个条目
public bool UpdateBusinessQuestionAnswers(BusinessQuestionAnswerServiceViewModel businessQuestionAnswerDto)
{
bool success = false;
try
{
int applicationId = businessQuestionAnswerDto.ApplicationId;
int businessId = businessQuestionAnswerDto.BusinessId;
var dtoAnswers = businessQuestionAnswerDto.BusinessQuestionAnswers;
foreach (var answer in dtoAnswers)
kyEntityProcessor.ProcessAnswers(applicationId, answer.Id, businessId, answer.Response);
kyGenericRepo.Save();
success = true;
}
catch (Exception ex)
{
_logger.Debug(ex);
}
return success;
}
kyEntityProcessor -> 函数:ProcessAnswers
public void ProcessAnswers(int applicationId, int questionId, int businessId, string response)
{
var answer = kyGenericRepo.FindByApp<KpBusinessQuestionAnswer>(applicationId, x => x.QuestionId == questionId).FirstOrDefault();
if (answer != null)
{
answer.Response = response;
kyGenericRepo.Edit(answer);
}
else if (!string.IsNullOrWhiteSpace(response))
{
var newAnswer = NewBusinessQuestionAnswer(businessId, applicationId, questionId, response);
kyGenericRepo.Add(newAnswer);
}
}
功能:NewBusinessQuestionAnswer
public KpBusinessQuestionAnswer NewBusinessQuestionAnswer(int? businessId, int? applicationId, int questionId, string response)
{
var newAnswer = new KpBusinessQuestionAnswer
{
AppId = applicationId,
BusinessId = businessId,
QuestionId = questionId,
Response = response,
IsDeleted = false
};
return newAnswer;
}
功能:kyGenericRepo.Add
public T Add<T>(T entity) where T : class
{
try
{
var _dbSet = context.Set<T>();
context.Entry(entity).State = EntityState.Added;
return _dbSet.Add(entity);
}
catch (Exception ex)
{
logger.Debug(ex);
return null;
}
}
如您所见,有一个 for 循环可以处理所有问题,并且我已经验证了每个问题 id 只有 1 个实例,因此应该只向数据库表添加 1 个条目。99% 的情况是这种情况,基本上在 308,768 条记录中,我有 5,656 个重复项和总共大约 30 个似乎被复制的唯一问题 ID。因此,在总共 220 个问题中,大约有 30 个问题是随机发生的。
大约 75% 的时间,这些副本上的时间戳完全相同,其余 25% 的时间,它们相差 ~200 毫秒。
数据从 AngularJS 窗体提交到 .NET Framework API,该 API 执行 SQL Server 2014 数据库的保存过程。这也只触发一次,这意味着不会同时向 API 发送重复的提交。
我在初次点击后禁用了提交按钮,这减少了双击提交,但我仍然收到重复项。我的猜测是 EF 或我的代码中发生了一些事情,导致这些重复项继续发生。
任何帮助将不胜感激!
答: 暂无答案
评论
FindByApp
() 检查没有看到(尚未保存的)第一个答案?