2012-06-13 96 views
0

我的同事帮助我在c#中开始编程,虽然我没有经验,但我喜欢它。一切都很顺利,直到我遇到了一些我们都无法解决的问题。他自己使用SQL,但是用LINQ开始了我。刷新LINQ数据库连接对象

做一个LINQ查询我使用这个对象:_oDBConnection(in clsApplication.cs) 所以当打开程序时,这个对象是建立的。但它会产生一些问题:

  • 当保存一个新对象(将数据放入表中)时,我无法在查询中加载这些值。我需要重新启动程序。
  • 当运行PROGRAMM的2个实例,在其他变化时,一个是没有得到的最​​新值(但它正显示出新的,但没有改变的!)

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

这是他建立了代码:

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(); 
} 

THX

+0

“public static DBReservationDataContext _oDBConnection;”没有。不,不,不,不。不,不!使用每个datacontext实例来完成一个工作单元。然后处理它(因为它实现了IDisposable)并为下一个工作单元创建一个新的工作单元。 –

回答

0

你的数据上下文将有一个Refresh方法,它会清除任何缓存的结果,而应该让你的查询,没有任何问题

0

static关键字使得它,以便完成每个AppDomain都有一个参考。这是使用DataContext实例的错误方法。

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

如果你想看到在数据库中更改,必须

1)告诉DataContext的停止跟踪更改。这必须在第一个查询之前完成,并使datacontext实例无法到SubmitChanges(因为它不能跟踪它们)。

OR

2)告诉它Refresh每次你怀疑实例已更改DataContext的。如果你这样做,你应该指定如何解决你的本地更改和远程更改之间的冲突 - 解决此冲突最简单的方法是没有本地更改。

OR

3)(正确的方法)创建一个新的DataContext实例,并与加载纪录!

还要注意:由于DataContext的实现IDisposable您需要调用Dispose当你与每个实例甚至当异常发生完成。 using块是实现这一目标的好方法。