如果一个实体失败约束,则保持实体框架不再终止插入语句

时间:2015-08-25 18:01:17

标签: c# sql sql-server entity-framework

当我想将多个用户导入我的数据库时,我在这里使用建议的方法:

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在没有问题的用户的情况下重试?

1 个答案:

答案 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):

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/3883322-support-for-merge-upsert-statement