使用实体框架批量插入两种相关表的重复记录的最佳方式是“更少的时间”?
问题描述:
我想批量插入到表“恩”和“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 - 包含数百万条记录 - 它会好得多。
答
一种选择是使用SqlBulkCopy。
基本上你会将所有数据批量插入临时表。
然后加入主登台表和DELETE
登台表中匹配的所有记录。
然后INSERT
从登台表中得到SELECT DISTINCT
的结果。
一个想法是批量插入登台表TU_RAW,例如,一切。然后使用存储过程将实际插入到TU中。这通常会减少时间并降低数据库连接。 – Jesse
如果您可以直接使用SQL SERVER ...它将比实体框架更快 –