查询总是返回先前的值?

时间:2013-03-31 04:23:03

标签: c# sql-server linq linq-to-sql

这是我第一次尝试使用LINQ to SQL创建C#桌面应用程序和SQL Server数据库。一切都很顺利,直到......

我总是得到一个表的先前值,即使我肯定已经更新了表,并检查MSSQL表中的值是否发生了变化。

可能是什么原因造成的?

我的代码如下:

:一种。打开StockAdjusment表单

StockAdjustment stockAdjustment = new StockAdjustment();
stockAdjustment.prepareForm(product);

B中。在prepareForm()内,我调用代码查询所选产品的当前数量

inventory = db.Inventories.Where(i => i.ProductID == product.ID).Single();
numCurrentStock.Value = inventory.Current_Quantity;

℃。在stockAdjustment表单关闭后,我存储新的库存调整

if (stockAdjustment.ShowDialog() == DialogResult.OK)
{
    db.InsertInventoryChange(stockAdjustment.inventory.ID, product.ID, stockAdjustment.stockChange, stockAdjustment.currentStock, stockAdjustment.Date, stockAdjustment.Message);
    db.SubmitChanges();
    readData();
}

readData()方法运行正常。它将显示新的库存调整,并且产品的当前数量确实发生了变化。我也检查了SQL Server表,它确实发生了变化。

d。但是,每次我打开一个新的StockAdjustment对话框时,它将始终显示当前数量的旧值。

只有在我关闭应用程序时才会显示实际值,然后重新启动它。

不知怎的,我认为这是我的应用程序代码问题,而不是LINQ。但我不知道..

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

db.InsertInventoryChange是否存储过程调用?如果是这样,我的外行人的理解是LINQ to SQL将不会跟踪由于调用而导致的任何值更改(而不是通过DataContext直接更新实体,因为LINQ to SQL的跟踪将知道这一点),所以调用:

db.SubmitChanges();

是多余的,因为LINQ to SQL DataContext不知道您已进行了更改,并且可能不提交任何内容并且不更新其内部值。所以当你这样做时:

db.Inventories.Where(i => i.ProductID == product.ID).Single();

您将获得之前的值,因为LINQ to SQL不知道更改,因此没有更新它一直在跟踪的值。

如果您持有DataContext而不是每次都创建一个新的,那么在进行db.Inventories.Where(i => i.ProductID == product.ID).Single();来电之前,您可以考虑refreshing,例如:

db.Refresh(RefreshMode.OverwriteCurrentValues);
inventory = db.Inventories.Where(i => i.ProductID == product.ID).Single();
numCurrentStock.Value = inventory.Current_Quantity;

可能有一种更优雅的方式来呼叫Refresh(),所以你不要完全破坏所有东西,但我在这里的经验是有限的。