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

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

问题描述:

我想批量插入到表“恩”和“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; 
    } 

这是很多连接到数据库和很多时间。

然后插入使用的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(); 
    } 

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

+0

一个想法是批量插入登台表TU_RAW,例如,一切。然后使用存储过程将实际插入到TU中。这通常会减少时间并降低数据库连接。 – Jesse

+0

如果您可以直接使用SQL SERVER ...它将比实体框架更快 –

一种选择是使用SqlBulkCopy

基本上你会将所有数据批量插入临时表。

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

然后INSERT从登台表中得到SELECT DISTINCT的结果。