刷新LINQ数据库连接对象

时间:2012-06-13 13:06:26

标签: linq database-connection

我的同事帮助我在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();
}
事先提前

2 个答案:

答案 0 :(得分:0)

您的数据上下文将使用Refresh方法清除所有缓存的结果,并且应该允许您的查询完成而没有任何问题

答案 1 :(得分:0)

static关键字使得每个AppDomain都有一个引用。这是使用DataContext实例的错误方法。

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

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

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

OR

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

OR

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

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