所以,我有一个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()
更好的维护顺序的方式?
答案 0 :(得分:8)
当您调用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();
}