使用实体框架批量插入的“更少时间”的最佳方式,不包括两个相关表的重复记录?

时间:2017-07-06 14:22:58

标签: c# asp.net sql-server entity-framework ado

我正在尝试批量插入表“TU”和“TUV”(一对多关系),没有“TU”表格列“HashText”的重复记录,所以我这样做了:

    /// <summary>
    /// Check if the selected TranslationUnit is exsists at db.
    /// </summary>
    /// <param name="translationUnit"></param>
    /// <returns></returns>
    public bool CheckDuplicate(TranslationUnit translationUnit)
    {

        int FoundedTusCount = db.TUs.Where(tu => tu.HashText == translationUnit.Hash && TmIDList.Any(tm => tm == tu.TMID)).Count();
        if(FoundedTusCount > 0)
        {
            return true;
        }
        return false;
    }

这与DB和很多时间有很多联系。

然后使用addRange()每10000(保存连接时间)记录将剩余项目插入数据库,如下所示:

            foreach (TranslationUnit item in Options.TMXFile.Data.Body.TranslationUnits.ToList())
            {
                TU tu = FillTU(TMID, item);
                ReadyTUs.Add(tu);
                tu.TUVs = new List<TUV>();
                foreach (TranslationUnitVariant item1 in item.TranslationUnitVariants)
                {
                    tu.TUVs.Add( FillTUV(item1));
                }
                if (ReadyTUs.Count >= 10000)
                {
                    Save();
                }
            }
            Save();

这是保存功能:

    private void Save()
    {
        db.TUs.AddRange(ReadyTUs);
        db.SaveChanges();
        ReadyTUs.Clear();
        db.Dispose();
        db = new GTMEntities();
    }

我现在的主要问题是时间和许多与DB的连接所以,如果有一些方法可以批量插入TU和TUV表而没有重复的TU - 包含数百万条记录 - 它会好得多。

1 个答案:

答案 0 :(得分:0)

一种选择是使用SqlBulkCopy

基本上,您将所有数据批量插入到临时表中。

然后加入主表和登台表以及DELETE临时表中匹配的所有记录。

然后INSERT进入实际表格,其中包含来自临时表的SELECT DISTINCT的结果。