这是我第一次尝试使用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。但我不知道..
有什么建议吗?
答案 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()
,所以你不要完全破坏所有东西,但我在这里的经验是有限的。