0

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

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

这可能是什么原因?

我的代码如下:

A. 打开 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;

C. stockAdjustment form Close后,我存储新的库存调整

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 对话框时,它总是会显示 Current Quantity 的旧值。

只有当我关闭应用程序并重新启动它时,它才能显示实际值。

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

有什么建议吗?

4

1 回答 1

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();,例如:

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

可能有一种更优雅的调用方式,Refresh()因此您不会完全破坏所有内容,但我在这里的经验是有限的。

于 2013-03-31T04:39:37.583 回答