C# 正在从缓存加载c对象属性
在我的win form应用程序中,有一种方法将以前创建的一些项组合在一起,当代码第一次运行时,一切正常,但在第二次和以后的运行中,组合的项的长度错误 代码使用对象类型为BetaData的LINQ从SQL server读取项 BetaData有一个名为Length的属性,该属性是double。 我有另一个列表,处理的项目存储在ModifiedPartList类型的名称PartList中 某些项的in-method-length属性发生更改,但在SQL上不会存储或保存任何内容。 这是主要的方法:C# 正在从缓存加载c对象属性,c#,winforms,oop,object,C#,Winforms,Oop,Object,在我的win form应用程序中,有一种方法将以前创建的一些项组合在一起,当代码第一次运行时,一切正常,但在第二次和以后的运行中,组合的项的长度错误 代码使用对象类型为BetaData的LINQ从SQL server读取项 BetaData有一个名为Length的属性,该属性是double。 我有另一个列表,处理的项目存储在ModifiedPartList类型的名称PartList中 某些项的in-method-length属性发生更改,但在SQL上不会存储或保存任何内容。 这是主要的方法: p
private List<ModifiedPartList> CombinePartList(ProgressBar Bar)
{
PartList.Clear();
List<BetaData> PartsinOrder = new List<BetaData>();
foreach (int view in Globals.Views)
{
List<int> OrdersInView = new List<int>();
foreach (Tuple<int, int> tuple in Globals.Orders)
{
if (tuple.Item1 == view)
{
if (!OrdersInView.Contains(tuple.Item2))
OrdersInView.Add(tuple.Item2);
}
}
if(OrdersInView.Count>0)
{
OrdersInView.Sort();
foreach (int order in OrdersInView)
{
//this is the section that problem occurs:
var parts = from BetaData in BetaContext.BetaDatas
where BetaData.ProjectName == Globals.ProjectName &&
BetaData.ProjectCode == Globals.ProjectCode &&
BetaData.ParentItem != Globals.ProjectName + "(" + Globals.ProjectCode + ")" &&
BetaData.View == view &&
BetaData.Order == order
select BetaData;
PartsinOrder.Clear();
PartsinOrder = parts.ToList();
foreach(BetaData part in PartsinOrder)
{
Bar.PerformStep();
}
}
}
PartsinOrder.Clear();
}
return PartList;
}
在我第二次运行代码时注释为“问题位置”的部分中,优化的长度属性被加载到项中,而不是从SQL加载到它们的原始值。我无法理解这一点,因为每次我都从SQL server读取所有项目。
关键是在这个阶段之后,我运行了好几次该方法,当我关闭程序并再次启动它时,得到了错误的结果,第一次运行时的结果是真的。
在从SQL中选择并将其转换为列表后,我检查了列表中的项及其属性,它们都是真的,但在foreach循环中,当每个部分进入循环时,它们的长度属性都是错误的。从SQL中检索数据后,使用文章和刷新上下文解决了此问题。是否尝试调试此方法?另外,您还没有发布实际保存更改的代码。我可以建议您通过将CombinePartList方法拆分为更小的方法来降低其复杂性吗?由于许多if/else构造,嵌套的长度和数量使得阅读和理解非常困难。我可以看到一些对SaveLength的调用。您是否可能正在覆盖数据库中的值,因此当您第二次运行它时,您实际上正在加载那些保存/更改的值?@PeterBons是的,我有,运行该方法后没有可能影响下一次运行的残差,我已一步一步地对其进行调试,当sql selection运行时,一切正常,但当对象被传递到foreach循环中时,它们会得到最后一次编辑的值,正如您在每次方法运行ClearAvedLength时的方法开头所看到的;清除已保存的所有参数。