我正在研究.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());
});
答案 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
检查,只需增加嵌套深度即可使代码更难阅读。
但是,鉴于我的测试试图重现您的错误,我怀疑您的实际代码与示例有所不同,即使在更新父代之后更新子代引用,代码也能正常工作。如果以上仍然存在问题,请使用您正在运行的代码更新示例。