我的同事帮助我在c#中开始编程,虽然我没有经验,但我喜欢它。一切顺利,直到我遇到一些我们都无法解决的问题。他自己使用SQL,但是让我开始使用LINQ。
要执行LINQ查询,我使用此对象:_oDBConnection(在clsApplication.cs中) 因此,在打开程序时,会构建此对象。但它会产生一些问题:
根据这些问题,我只能得出结论,当我第二次调用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();
}
事先提前
答案 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
块是实现这一目标的好方法。