C# 实体框架导航属性记录从一个记录移动到另一个记录;“等待操作超时”;
我的实体框架存储库中的这个简单函数让我头疼。 我已经做过无数次类似的事情,但这一次只给了我一个win32异常等待操作超时 个人(1-*)礼品 不知何故,我希望我不能将礼物从一个个体迁移到另一个个体,因为我正在循环我正在改变的同一个集合 我检查了sys.dm_tran_locks,在sql中这两个表上都没有显示任何正在运行的锁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
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指出了正确的方向,