2

我正在使用 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

提前致谢。

4

1 回答 1

1

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

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

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

于 2013-01-29T21:28:09.473 回答