什么逻辑确定实体框架6的插入顺序

时间:2016-01-14 17:09:51

标签: c# entity-framework entity-framework-6 entity-framework-core

所以,我有一个DBContext,我正在做以下操作:

dbContext.SomeTables1.Add(object1)
dbContext.SomeTables2.AddRange(objectArray2)
dbContext.SomeTables3.AddRange(objectArray3)
dbContext.SaveChanges();

EF不按此顺序插入db记录,它以随机顺序插入它们。要以相同的顺序插入它们,我必须在每次添加后执行dbContext.SaveChanges()。这不是一个有效的解决方案,在我的情况下,我需要10秒钟来完成所有插入操作,而一次保存的随机顺序大约需要3秒。

N.B。我需要正确的命令来解决死锁问题。

我的问题是:

  
      
  • 此问题是否已在EF7中解决?
  •   
  • 我可以对EF进行配置并确定随机顺序,但是,是否保证它将与相同的随机顺序一致或   请求之间是否有变化? (如果是,我可以采用我的其他代码   回答这个问题是积极的。)
  •   
  • 每次添加时,是否有比dbContext.SaveChanges()更好的维护顺序的方式?
  •   

3 个答案:

答案 0 :(得分:8)

  • 您无法在EF6或EF7中指定保存订单。
  • EF7中未解决此问题,因为这不是问题。
  • 如果前任相同(可能很少发生),订单将是相同的

当您调用SaveChanges时,所有实体都是从“ProduceDynamicCommands”方法的内部订单中排序,然后通过“TryTopologicalSort”方法再次排序,该方法循环添加没有前任的命令(如果添加A和B,并且依赖于A)在B上,然后B将插入A)之前

您可以通过批量添加进行插入。

由于执行插入需要3秒钟,我将假设您有数千个实体,并且执行批量插入可以提高您的性能,将10秒减少到更少,然后可能是最初的3秒!

以下是我推荐的2个图书馆:

免责声明:我是Entity Framework Extensions项目的所有者。

答案 1 :(得分:0)

我找到了一种方法。只是以为我会让你知道:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<error.h>
#include<errno.h>
#include<fcntl.h>
#define buf_size 512

int main(int argc, char *argv[])
{
    int bytes;
    int offset;
    int fd;
    int i = 0;
    int length = 0;
    ssize_t read_bytes;
    char *file;
    char buf[buf_size];

    if (argc != 4)
        error(1, 0, "Too many or less than the number of arguments");
    file = argv[1];
    offset = atoi(argv[2]);
    bytes = atoi(argv[3]);
    fd = open(file, O_RDONLY);
    if (fd == -1)
        error(1, errno, "Error while opening the file\n");
    while (1) {
        read_bytes = read(fd, buf, bytes);
        if (read_bytes == -1)
            error(1, errno, "Error while reading the file\n");
        length += read_bytes;
        printf("The length is : %d\n", length);
        if (length >= offset) {
            for (i = length ; i < bytes; i++)
                putchar(buf[i]);
            break;
        }
    }
    if (close(fd) == -1)
        error(1, 0, "Error while closing the file\n");

}

答案 2 :(得分:0)

要在 EF 和 EF Core 的 Identity 列中显式设置主键的值(以及聚集索引的顺序),您需要在调用 IDENTITY_INSERT 之前手动打开 _context.SaveChanges()之后你需要像这样关闭 IDENTITY_INSERT此示例假设使用 EF Core

// Add your items with Identity Primary Key field manually set
_context.SomeTables1.AddRange(yourItems);
_context.Database.OpenConnection();
try {
      _context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.SomeTables1 ON");
      _context.SaveChanges();
      _context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT dbo.SomeTables1 OFF");
} finally {
      _context.Database.CloseConnection();
}