【问题标题】:Linq-To-Sql Batch Updating with Duplicates带有重复项的 Linq-To-Sql 批量更新
【发布时间】:2013-01-29 00:02:08
【问题描述】:

我正在使用 C# .NET 3.5 中的 LINQ-To-SQL 更新数据库,但我使用的数据并不总是很好。插入的数据和数据库中很有可能会出现重复。

目前,我正在使用它,其中 dataSetOnedataSetTwodataSetThree 是要更新的模型列表:

AppDataContext db = new AppDataContext();

db.DatasetOne.InsertAllOnSubmit(dataSetOne);
db.DatasetTwo.InsertAllOnSubmit(dataSetTwo);
db.DatasetThree.InsertAllOnSubmit(dataSetThree);

try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (Exception e)
{
    CsvToImsConverter.Log.Error(e.Message);

    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType());
        Console.WriteLine("Error in Table: {0}", metatable.TableName);
    }
}

这很好用。我遇到的问题是,如果有任何重复,则程序不会更新,从而引发主键违规。我想插入没有违反主键的值,并更新那些没有。

我可以在数据库中搜索重复项,但由于数据库中可能有数千条记录,而我试图插入数百条记录,这可能会非常昂贵。有什么方法可以捕获主键违规错误,更新此记录并继续?由于不会有很多重复,这将是一个更好的解决方案。使用 LINQ-To-SQL 不是强制性的。

使用foreach 循环并使用catch 语句插入列表中的每个对象会更好吗?

提前致谢。

【问题讨论】:

  • 在插入处移动 try catch ....
  • 插入工作正常,因为它们没有更新数据库。引发异常的是 SubmitChanges。
  • 您是否尝试过检查现有情况以了解您实际获得了多少性能影响?考虑过早的优化万恶之源等等......像这样stackoverflow.com/questions/100068/…
  • 这就是我要做的,但我想我会检查是否有更好的方法。可能只有 2-3 个具有重复项的对象,并且在 db 中解析数千个这样一个小数字似乎效率很低。

标签: c# .net sql linq-to-sql


【解决方案1】:

您担心性能,同时使用 Linq-2-sql 进行批量插入/更新。这不是很一致,因为 linq-2-sql 不适合批处理操作(至少在您需要它们快速的情况下不适合)。

不要被 InsertAllOnSumbit 所迷惑... Linq-2-sql 将为每个插入创建单独的插入语句。这本身就已经很慢了。

您最好将 datasetOne/Two/Three 批量插入临时表(例如使用 SqlBulkCopy),然后使用合并语句移动到目标表。

【讨论】:

  • 感谢您的建议,我会调查一下。
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多