Linq Db.SaveChanges与ForEach Loop一起使用

时间:2013-09-03 11:35:30

标签: c# sql

我有一个包含12000条记录的Sql表,需要将其复制到另一个表中。

mset1 md = new mset1();
mset2 pd = new mset2();
foreach (var b in md.Myset) //dbset
{
    Obj m = new Obj()
    {
        coslat = b.coslat,//float
        Code = b.Code.Remove(b.Code.Length - 1),//string
        sinlat = b.sinlat,//float
        lat = b.lat,//float
        lon = b.lon,//float
        latrad = b.latrad,//float
        lonrad = b.lonrad //float
    };
    pd.Postcodeset.Add(m);
    pd.SaveChanges();
}

我想知道什么时候才能有效SaveChanges()。它应该在For循环内还是在For循环之外。

编辑:我很担心,因为我有7 floatsstring Code平均每个10kb。如果我不在For循环中保存更改,我可能会耗尽内存。

6 个答案:

答案 0 :(得分:2)

最好将它放在循环之外 - 这意味着一旦处理完成,数据层就会更新。

别的提及/建议: 将foreach代码放在Try Catch内,如果出现异常,请使用RollBack()。这将“回滚”对数据库所做的任何更改,并避免产生负面影响 - de。

RollBack Function

希望这有帮助。

答案 1 :(得分:0)

将它放在for循环之外。

您要添加到foreach中的集合(PostCodeSet),但只需要提交一次集合,因此有必要拨打SaveChanges一次而不是n次。

答案 2 :(得分:0)

你应该移动

pd.SaveChanges();

在循环之外,所以你只对数据库进行1次调用。

答案 3 :(得分:0)

我总是把它放在for循环之外。不是出于性能原因,而是因为更改将在事务中完成。

我希望它的效率更高,因为您对数据库的请求更少。

答案 4 :(得分:0)

添加多行后,只需一个SaveChanges的好处是所有更新都将在unit of work下完成。

如果批量插入物的高性能是您的首要要求,那么我相信您使用错误的工具 - 例如请改为SqlBulkCopy

答案 5 :(得分:0)

你必须将其移到loop之外。

pd.Postcodeset中添加数据后保存所有更改。