0

我的同事帮助我开始使用 c# 编程,虽然我没有经验,但我喜欢它。一切都很顺利,直到我遇到了一些我们都无法解决的问题。他自己使用 SQL,但让我开始使用 LINQ。

要进行 LINQ 查询,我使用此对象:_oDBConnection(在 clsApplication.cs 中)因此,当打开程序时,会构建此对象。但它会产生一些问题:

  • 保存新对象(将数据放入表中)时,我无法通过查询加载这些值。我需要重新启动程序。
  • 当运行程序的 2 个实例时,一个在另一个实例中更改时没有获得最新的值(但它显示的是新的值,而不是更改的值!)

根据这些问题,我只能得出结论,当我第二次调用 clsApplication._oDBConnection.tblTAble 时,它​​不会再次重新链接到数据库,而是将旧的数据库状态返回给我。

这是他构建的代码:

public static DBReservationDataContext _oDBConnection;
private static frmMain _fMain;
public clsApplication()
{
    Thread.CurrentThread.Name = "main";
    clsErrorLog.ErrorLocation = "C:\\Software\\ErrorLog";
    clsErrorLog.setPassword("*****");
    clsErrorLog.LockApplication += new clsErrorLog.dLockApplication(lockApplication);

    _oDBConnection = new DBReservationDataContext();

    _fMain = new frmMain();
    _fMain.Show();
}

我能做些什么来解决这个问题?

例子:

虽然存在于数据库中,但它在此查询中崩溃,因为未找到具有 id == iID 的实体。但是 iID 是正确的,并且它确实存在于数据库中。关闭并重新启动程序后,查询将起作用。然后再次调用 clsApplication。

public clsReservationDetail(int iID)
    :this()
{
    _oReservationDetail = (from oReservationDetailQuery in clsApplication._oDBConnection.tblReservationDetails
            where oReservationDetailQuery.ID == iID
            select oReservationDetailQuery).First();
}

提前谢谢

4

2 回答 2

0

您的数据上下文将有一个Refresh方法可以清除任何缓存的结果,并且应该允许您的查询顺利完成

于 2012-06-15T20:25:03.370 回答
0

static 关键字使您可以为每个 AppDomain 提供一个引用。这是使用 DataContext 实例的错误方法。

DataContext 的每个实例都会跟踪它所看到的对象。这是为了一致性。如果您从一个查询中获得 CustomerID = 4 的 Customer 实例,您应该从另一个返回 CustomerID = 4 记录的查询中获得相同的 Customer 实例。

如果要查看数据库中的更改,则必须

1)告诉数据上下文停止跟踪更改。这必须在第一次查询之前完成,并使 datacontext 实例无法SubmitChanges(因为它无法再跟踪它们)。

或者

2)将数据上下文告诉Refresh您怀疑已更改的每个实例。如果这样做,您应该指定如何解决本地更改和远程更改之间的冲突 - 解决此冲突的最简单方法是不进行本地更改。

或者

3)(正确的方法)创建一个新的 DataContext 实例并用它加载记录!

另请注意:由于 DataContext 实现IDisposable即使发生异常,您也需要Dispose在完成每个实例时调用。阻止是实现这一目标的好方法。using

于 2012-06-15T21:05:22.737 回答