1

我的 Entity 框架存储库中的这个简单函数让我很头疼。我已经做了一百万次类似的事情,但是这个只是一直给我一个WIN32Exception 等待操作超时

个人 (1 - *) 礼物

不知何故,我希望我不能将礼物从 Individu 迁移到另一个,因为我正在循环遍历我正在更改的同一组。

我检查了 sys.dm_tran_locks 并且这没有显示 sql 中任一表上的任何正在运行的锁。

   public void MigrateDataForInd(Individu from, Individu to){
        foreach (var item in from.Gifts.ToList()) {
            to.Gifts.Add(item);
            //also tried: item.Individu = to;
        }
        this.SaveChanges();
     }

关于如何规避这个问题的任何想法?(增加锁定超时时间没有帮助,我在使用其他导航属性时遇到同样的错误(礼物只是其中之一)

更新: 为了让你们了解我在这里处理的数据量:

有 +- 500.000 INdividus,总共有 +- 1000 万份礼物。每个人有 0 到 100 份礼物

您是否认为这个原因足以将此代码从 EF 中移出并在更新查询中运行迁移?(从上面的数据你可以看到我在一个事务中只更新了 100 行,这已经给了我超时)

4

4 回答 4

2

这里有 +- 500.000 INdividus,总共 +- 1000 万份礼物。每个人有 0 到 100 份礼物

您是否认为这个原因足以将此代码从 EF 中移出并在更新查询中运行迁移?(从上面的数据你可以看到我在一个事务中只更新了 100 行,这已经给了我超时)

绝对地!您需要有一个非常令人信服的理由才能将所有数据从数据库中取出,以便稍后发回。性能上的差异是巨大的。

至于原来的问题,看起来很不对劲,这也是本例直接上SQL的另一个原因。如果您在更新时遇到问题,请查看执行计划,它可能会让您更接近。

于 2013-07-01T14:02:16.193 回答
1

如果你试试这个怎么办:

 public void MigrateDataForInd(Individu from, Individu to){
        var offlineGifts = from.Gifts.ToList();
        foreach (var offlineGift in offlineGifts ) {
            from.Gifts.DeleteObject(offlineGift );
            to.Gifts.Add(offlineGift );
        }
        this.SaveChanges();
     }

或者也许在第二个 foreach 循环中调用 SaveChanges ?

于 2013-07-03T12:31:56.487 回答
1

Jeroen 快到了 :)

它应该被删除。

public void MigrateDataForInd(Individu from, Individu to)
{
    var offlineGifts = from.Gifts.ToList();
    foreach (var item in offlineGifts)
    {
        from.Gifts.Remove(item);
        to.Gifts.Add(item);
    }
    this.Save();
}
于 2013-07-04T14:02:14.520 回答
0

增加超时时间不会解决这个问题,

代码有问题,不要使用.Tolist(),我已经修改了上面的代码,试试看,对你有帮助吗

 public void MigrateDataForInd(Individu from.Gifts, Individu1 to){
        foreach (var item in from.Gifts) {
            to.Gifts.Add(item);            
        }
        this.SaveChanges();
     }

我在这里考虑 Individu 是具有另一个列表礼物的列表对象

于 2013-06-28T09:45:01.407 回答