当我想将多个用户导入我的数据库时,我在这里使用建议的方法:
Improving bulk insert performance in Entity framework
这是我的代码:
int countOfAddedUsers = 1;
int commitChunkSize = i_ChunkSize;
int numOfChunksCommited = 0;
foreach (var user in i_Users)
{
i_Progress.Report(m_SW.Elapsed.ToString(@"mm\:ss") + " (" + countOfAddedUsers.ToString("D5") + ") Adding user to chunk: " + user.Username + "..." + Environment.NewLine);
user.Roles.Add(UserRole);
context.Users.Add(user);
countOfAddedUsers++;
if (countOfAddedUsers % commitChunkSize == 0)
{
var chunkNumber = countOfAddedUsers / commitChunkSize;
writeUsersToDB(i_Progress, context, chunkNumber);
numOfChunksCommited++;
}
}
if (numOfChunksCommited == 0)
{
writeUsersToDB(i_Progress, context, 0);
numOfChunksCommited++;
}
现在我的问题是,在导入过程中,其中一个用户可能已经存在于数据库中,或者具有相同的username
。
在这种情况下,我得到一个DBValidationException
并且由于该一个用户而终止了整个“Chunk”插入。
如何为每个用户强制使用单独的插入语句,或者至少告诉EF在没有问题的用户的情况下重试?
答案 0 :(得分:0)
您正在寻找的是等同于TSQL合并声明。当值不存在时插入,当值已存在时更新(或不执行任何操作)。不幸的是,EF没有类似的陈述。
这个关于stackoverflow的现有问题几乎可以解答这个问题。
How can I use use Entity Framework to do a MERGE when I don't know if the record exists?
不要忘记,您始终可以使用阶段表,然后在实体框架中实际使用带有显式TSQL的合并语句。
您还可以在此处投票通过功能请求(支持EF Merge):