Linqpad提交变更失效:动态查询赋值未生效问题排查
问题:LinqPad提交变更未生效,直接赋值整数却正常
我多次使用LinqPad操作数据,曾更新过数百万条记录,但此次提交变更时遇到异常。现有两张表:ABSPaylarOlcmeProgram(关联表)、BolumYeterlilik(定义表),部分关联记录的年份录入错误,需要修正。我的LinqPad查询代码如下:
var list = ABSPaylarOlcmeProgram.Where(x => x.FKPaylarOlcme.FKPaylar.Yil != x.FKProgramCikti.Yil).ToList(); foreach (var element in list) { Console.WriteLine(element.FKProgramCiktiID); element.FKProgramCiktiID = BolumYeterlilik.First(x=> x.FKProgramBirimID == element.FKProgramCikti.FKProgramBirimID && x.Yil == element.FKPaylarOlcme.FKPaylar.Yil && x.Sira == element.FKProgramCikti.Sira).ID; Console.WriteLine(element.FKProgramCiktiID); } SubmitChanges();
通过查询筛选出年份不匹配的错误关联记录,在循环中尝试通过BolumYeterlilik.First查询获取正确ID赋值给element.FKProgramCiktiID,控制台能输出新ID,但执行SubmitChanges()后变更未生效;若直接赋值整数则可正常提交。请问问题出在哪里?是否与变更追踪有关?
分析与解决方法
变更追踪未识别到属性变更:你通过
BolumYeterlilik.First()查询得到的ID,是来自LinqPad上下文追踪的实体属性。Linq to SQL的变更追踪依赖属性setter触发通知,当直接引用追踪实体的属性值赋值时,变更追踪器可能因内部缓存或逻辑,无法识别这是一个有效变更;而直接赋值整数属于简单值类型操作,能被正常捕获。解决方法1:切断与追踪实体的关联:先将查询到的ID存入局部变量,再赋值给目标属性,避免直接引用上下文追踪的实体:
foreach (var element in list) { Console.WriteLine(element.FKProgramCiktiID); // 先把ID存到局部变量 var correctId = BolumYeterlilik.First(x => x.FKProgramBirimID == element.FKProgramCikti.FKProgramBirimID && x.Yil == element.FKPaylarOlcme.FKPaylar.Yil && x.Sira == element.FKProgramCikti.Sira).ID; element.FKProgramCiktiID = correctId; Console.WriteLine(element.FKProgramCiktiID); }解决方法2:手动触发变更检测:如果局部变量方法无效,可手动通知变更追踪器标记实体为修改状态,在赋值后添加:
// Linq to SQL中手动刷新实体状态 GetTable<ABSPaylarOlcmeProgram>().Context.Refresh(RefreshMode.KeepCurrentValues, element); // 可提前验证变更是否被追踪 // Console.WriteLine(GetChangeSet().Updates.Count); // 查看Updates集合是否有记录验证变更状态:在
SubmitChanges()前调用GetChangeSet(),检查输出的Updates集合是否包含修改的记录。若集合为空,说明变更未被追踪,需调整赋值方式或手动触发检测。
内容的提问来源于stack exchange,提问作者Hakkı
相关产品推荐
相关产品推荐

