要么我不明白AsNoTracking应该如何工作,要么我做错了什么。根据我的阅读,它应该在没有将其保存在EF缓存中的情况下提取记录,从而有效地允许我将其重新添加为新行。
我有这段代码,而且我正在更改主键,但是当我尝试保存更改时,它会抛出一个异常,说它因为重复键而无法添加它。奇怪的是异常列出了OLD id而不是新生成的id。
有什么想法?我拔出了头发。
var coverage = db.Coverages.AsNoTracking().Where(c => c.ID == oldCoverageID).FirstOrDefault();
coverage.ID = Guid.NewGuid();
coverage.PolicyID = newPolicy.ID;
db.Coverages.Add(coverage);
db.SaveChanges(); // erroring here
事实证明,我在调用该方法之前使用原始记录的子实体来获取ID。我假设即使我在原始记录上调用AsNoTracking(),EF仍然会缓存子实体。并且没有任何方法可以调用它。所以,我所做的是使用另一个调用数据库而不是使用子实体来获取ID。我不知道为什么会奏效。但确实如此。如果有人可以解释更好的解决方案或存在问题的原因,请做。我会给那些帮助弄清楚为什么EF会这样做的答案。
在这里添加上下文是我在将该ID发送到该方法之前获取旧ID的方法。
// fetching the id this way gave me fits
Guid oldCoverageID = existingPolicy.Coverage.Where(c => c.PolicyID == "policy id").First().ID;
// grabing the id doing this made everything happy
Guid oldCoverageID = db.Coverages.Where(c => c.POLICYHDRID == oldPolicyID).FirstOrDefault().ID;
我在获取政策时也做了AsNoTracking()..我不认为那会很重要......但只是丢掉尽可能多的信息。