C# 实体框架导航属性记录从一个记录移动到另一个记录;“等待操作超时”;

C# 实体框架导航属性记录从一个记录移动到另一个记录;“等待操作超时”;,c#,entity-framework-4,navigational-properties,C#,Entity Framework 4,Navigational Properties,我的实体框架存储库中的这个简单函数让我头疼。 我已经做过无数次类似的事情,但这一次只给了我一个win32异常等待操作超时 个人(1-*)礼品 不知何故,我希望我不能将礼物从一个个体迁移到另一个个体,因为我正在循环我正在改变的同一个集合 我检查了sys.dm_tran_locks,在sql中这两个表上都没有显示任何正在运行的锁 public void MigrateDataForInd(Individu from, Individu to){ foreach (var ite

我的实体框架存储库中的这个简单函数让我头疼。 我已经做过无数次类似的事情,但这一次只给了我一个win32异常等待操作超时

个人(1-*)礼品

不知何故,我希望我不能将礼物从一个个体迁移到另一个个体,因为我正在循环我正在改变的同一个集合

我检查了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();
     }
有没有关于如何规避这个问题的想法?(增加锁定超时时间没有帮助,在使用其他导航属性时,我也会遇到同样的错误(礼品只是其中之一)

更新: 给大家一个我在这里处理的数据量的图像:

有+-50万个人,总共+-1000万件礼物。 每个人都有0到100件礼物


你认为这个理由足以将这个代码从EF中移开并在更新查询中运行迁移吗?(从上面的数据可以看出,我只更新一个事务中的100行,并且已经给了我超时)

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

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

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

我在这里考虑的是个人是列表对象,拥有另一个列表礼物

增加超时时间并不能解决这个问题

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

 public void MigrateDataForInd(Individu from.Gifts, Individu1 to){
        foreach (var item in from.Gifts) {
            to.Gifts.Add(item);            
        }
        this.SaveChanges();
     }
我在这里考虑的是个人是有另一份清单礼物的清单对象

这里有+-50万个人,总共+-1000万件礼物。 每个人都有0到100件礼物

你认为这个理由足以把这个代码从EF中移开吗? 在更新查询中运行迁移?(根据上述数据,您可以 请注意,我在一个事务中只更新了100行,并且 已经给了我超时时间)

当然!您需要有一个非常有说服力的理由将所有数据从数据库中取出,以便稍后发回。性能上的差异是巨大的

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

这里有+-50万个人,总共+-1000万件礼物。 每个人都有0到100件礼物

你认为这个理由足以把这个代码从EF中移开吗? 在更新查询中运行迁移?(根据上述数据,您可以 请注意,我在一个事务中只更新了100行,并且 已经给了我超时时间)

当然!您需要有一个非常有说服力的理由将所有数据从数据库中取出,以便稍后发回。性能上的差异是巨大的

至于最初的问题,有些地方看起来很不对劲,这是在本例中直接转到SQL的另一个原因。如果您在更新过程中遇到问题,请查看执行计划,它可能会让您更接近SQL。

如果您尝试以下方法,会怎么样:

 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?

如果您尝试以下操作会怎么样:

 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?

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();
}
杰罗恩就快到了:)

它应该被移除

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();
}

关于如何改进我的问题以使其更容易回答的任何建议欢迎。。真的需要一个解决方案。检查您的表中是否有触发器/级联。这些表中没有触发器或级联,只有FK上的一些外键和索引。关于如何改进我的问题以使其更容易回答欢迎。。真的需要一个解决方案。检查你的表中是否有触发器/级联。没有触发器或级联,只有一些外键和索引在那些FK上。谢谢提示,我已经尝试过了。由于to.gives.Add(item)修改了from.gives集合,因此出现了一个异常,表示我无法修改集合。ToList解决了这个问题。反过来说,你应该让ToList像Mvision一样有经验。谢谢你的提示,我已经试过了。由于to.gives.Add(item)修改了from.gives集合,因此出现了一个异常,表示我无法修改集合。ToList解决了这个问题。反过来说,你应该让ToList作为Mvision体验。+1对于你评论的第二部分,我会尝试手动操作,稍后再回复你+1对于你评论的第二部分,我会尝试手动操作,稍后再回复你。删除对象对我来说在EntityCollection上不存在,也许这是另一个版本的EF的问题,然后我试着从db.Gifts.DeleteObject中删除它,但也不起作用,关于删除状态,无论如何感谢+1为tom指出了正确的方向,我在EntityCollection上不存在DeleteObject,也许这是另一个版本的EF的问题,然后我试着从db.Gifts.DeleteObject中删除它,但这也不起作用,smth关于删除状态,无论如何感谢+1为tom指出了正确的方向,