【问题标题】:keep entity framework from terminating insert statment if one entity fails constraint如果一个实体约束失败,则阻止实体框架终止插入语句
【发布时间】:2015-08-25 18:01:17
【问题描述】:

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

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,并且整个“块”插入因为那个用户而被终止。

如何强制为每个用户单独插入语句,或者至少告诉 EF 在没有问题用户的情况下重试?

【问题讨论】:

  • 这对你有用吗? context.Configuration.ValidateOnSaveEnabled = false;
  • nope .. 这仅检查数据注释验证,而不检查外键或唯一约束的 db 验证

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


【解决方案1】:

您正在寻找的内容等同于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2019-05-22
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多