实体框架核心抛出DbUpdateConcurrencyException

时间:2018-11-20 17:05:47

标签: entity-framework .net-core

我正在研究.net核心实体框架。我有两个类类型列表。一个用于更新,另一个用于新条目,添加新记录都可以,但是可以通过上下文来实现。[模型]。添加但可以通过上下文来实现。[模型] .Update抛出异常更新,我知道没有记录被更新为它在本地运行。

String

代码

const dns = require('dns');
const Table = require('cli-table');
const hosts = ['Server01', 'Server02', 'Server03'];
let list = [];

table = new Table({
    head: ['Host', 'Location']
    , colWidths: [20, 30]
});

function process() {
  return new Promise((resolve, reject) => {
    hosts.forEach(host => {
        dns.lookup(host, function (err, result) {
            ipSplit = result.split(".");
            r = ipSplit[0] + '.' + ipSplit[1] + '.' + ipSplit[2];
            if (r == '10.23.13') {
                resolve(list.push([host, 'Lab A112']));
            }
            else {
                reject(list.push([host, 'Unknown']));
            }
        });
    });
  }) 
};

function build () {
  return new Promise((resolve, reject)=>{
    resolve(table.push(list);)
  })

};

function push () {
    console.log(table.toString());
};
async function waitForFunctions() {
  try{
    const resOne = await process();
    const resTwo = await build()
  } catch(error){
    console.log(error);
  }
  return Promise.all([resOne, resTwo])
}
waitForFunctions()
.then((values)=>{
  console.log(values);
  console.log(push());
});

1 个答案:

答案 0 :(得分:2)

我无法抗拒报价: “我认为[您的代码]并不意味着您认为的含义。“

假设SurveyResponseListToUpdate是先前加载和修改的实体的列表:

if (answerObject.AnswerOptions.Count > 0) // Unnecessary...
{
  foreach (var optItem in answerObject.AnswerOptions)
  {
    AnswerOptionDataModel answOpt = new AnswerOptionDataModel(); // does nothing.
    answOpt = optItem; // references existing answer option..
    Context.AnswerOptions.Update(answOpt);
  }
}

整个区块归结为:

  foreach (var optItem in answerObject.AnswerOptions)
    Context.AnswerOptions.Update(optItem);

您可能遇到的错误是因为Update将自动通过导航属性进行递归,因此,当父项(Answer)更新时,它的AnswerOptions也将被更新。因此,当您执行其他步骤尝试保存答案选项时,保存答案时这些选项已经更新。前提是答案是通过与保存该答案相同的上下文加载的,那么您应该很清楚:

foreach (var answerObject in surveyResponseListToUpdate)
  Context.Answers.Update(answerObject);

var recordsAffected = Context.SaveChanges();

这应该更新答案及其相关的答案对象。即使添加或删除了选项,变更跟踪也应尽力而为,并确保所有相关数据记录都已更新。 不需要额外的if检查,只需增加嵌套深度即可使代码更难阅读。

但是,鉴于我的测试试图重现您的错误,我怀疑您的实际代码与示例有所不同,即使在更新父代之后更新子代引用,代码也能正常工作。如果以上仍然存在问题,请使用您正在运行的代码更新示例。