所以,我有一个 DBContext,我正在执行以下操作:
dbContext.SomeTables1.Add(object1)
dbContext.SomeTables2.AddRange(objectArray2)
dbContext.SomeTables3.AddRange(objectArray3)
dbContext.SaveChanges();
EF 不会按此顺序插入数据库记录,它会按随机顺序插入它们。要以相同的顺序插入它们,我必须在每次添加后执行 dbContext.SaveChanges()
。这不是一个有效的解决方案,就我而言,完成所有插入需要 10 秒,而一次保存的随机顺序大约需要 3 秒。
注意我需要正确的顺序来解决死锁问题。
我的问题是:
- Is this issue resolved in EF7?
- I can profile EF and determine the random order, however, is there a guarantee that it will be consistently with the same random order or does it change between requests? (I can adopt my other code if the answer to this question is positive).
- Is there a better way of maintaining the order than
dbContext.SaveChanges()
on every addition?
最佳答案
- 无法在 EF6 或 EF Core(最初命名为 EF7)中指定保存顺序。
- 此问题未在 EF Core(最初命名为 EF7)中解决,因为这不是问题。
- 如果前任相同,则顺序将相同(这种情况很少发生)
当您调用 SaveChanges 时,所有实体都按照“ProduceDynamicCommands”方法中的内部顺序进行排序,然后通过“TryTopologicalSort”方法再次排序,该方法循环添加没有前任的命令(如果您添加 A 和 B,A 取决于在 B 上,那么 B 将被插入到 A 之前)
留给你批量添加插入。
由于执行插入需要 3 秒,我假设您有数千个实体并且执行批量插入可能会提高您的性能,将 10 秒减少到更少,然后可能是最初的 3 秒!
这里有 2 个我可以推荐的库:
- https://efbulkinsert.codeplex.com/
- 免费但不适用于所有类型的关联和继承
- http://entityframework-extensions.net/
- 付费但支持一切
免责声明:我是 Entity Framework Extensions 项目的所有者。
关于c# - Entity Framework 6 的插入顺序由什么逻辑决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795577/