我有一段代码可以使用某种逻辑来重新处理api rest服务控制器中的一组实体。 在生产环境中,就这样的逻辑意义而言,我已经开始无法获得异常了:
>Mensaje:Value cannot be null.
>Parameter name: source
>Source:System.Linq
>InnerException:
>StackTrace: at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, >Func`2 predicate)
当我尝试在本地环境中重现错误或在生产环境中重现事件时,我发现这种错误是随机发生的,因此很难重现。
经过大量测试,我一次又一次在调试时重现异常,我发现从一行到另一行,我得到的实体属性之一为空,没有我能理解的理由。
首先,我认为也许我只在一个数据库上下文实例中使用了太多实体,所以我尝试列出较小的列表。但是错误仍然在发生。确实只有15个实体,我仍然得到了例外。
这是代码结构的外观:
private static void StartProces( List<Someentitie> someentitie)
{
const int packageAmount = 200;
var index = 0;
while (indice < fichadas.Count )//sometimes are 15, sometimes are 10.000. I get the error in both cases.
{
var myEntitiePackage = someentitie.Skip(index).Take(packageAmount).Select(f => f.Id).ToList();
index += packageAmount - 1;
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlServer(AppSettingsHelper.ConnectionStrings.DefaultConnection)
.UseLoggerFactory(LoggingHelper.LoggerFactory);
var newDb = new MyContext(optionsBuilder.Options);
var myEntities = newDb.Entities.Where(f => myEntitiePackage.Contains(f.Id)).Include(f => f.subEntitie)
.Include(f => f.anotherSubEntitie)
.Include(f => f.AnotherSubSubEntitite).ToList();
myEntities.ForEach(f =>
{
f.ReProcess(dbNuevo);
});
}
}
public void ReProcess(MyContext db)
{
CleanAndSaveMyEntitie(db);
FillEntitieWithBasicAttributesAndSave(db)
// At this point this.importantAttribute has a value
new AuditoryLine(this, userId).Create(db);
db.SaveChanges();
// At this point this.importantAttribute is null
....
}