Winforms LINQ到SQL和缓存
我在LINQtoSQL和缓存方面遇到了麻烦。 我已经在这方面发现了类似的问题,但它们似乎都没有处理在应用程序之外修改db的情况 假设我有一个Windows窗体应用程序,其中用户可以每天浏览一些只读数据。 这是我的代码的一个非常简化的版本:Winforms LINQ到SQL和缓存,winforms,linq-to-sql,Winforms,Linq To Sql,我在LINQtoSQL和缓存方面遇到了麻烦。 我已经在这方面发现了类似的问题,但它们似乎都没有处理在应用程序之外修改db的情况 假设我有一个Windows窗体应用程序,其中用户可以每天浏览一些只读数据。 这是我的代码的一个非常简化的版本: public partial class Form1 : Form { DateTime curDate = new DateTime(2001, 1, 1); DataClasses1DataContext dc = new DataCla
public partial class Form1 : Form
{
DateTime curDate = new DateTime(2001, 1, 1);
DataClasses1DataContext dc = new DataClasses1DataContext();
public Form1()
{
InitializeComponent();
dc.Log = Console.Out;
cmdPrev.Click += PrevNext;
cmdNext.Click += PrevNext;
}
private void Form1_Load(object sender, EventArgs e)
{
LoadValues();
}
private void PrevNext(object sender, EventArgs e)
{
var delta = sender == cmdPrev ? -1 : 1;
curDate = curDate.AddDays(delta);
LoadValues();
}
private void LoadValues()
{
var q = from v in dc.temptbl where v.Date == curDate select v;
// listBox is used for debugging only.
listBox1.Items.Clear();
foreach (var v in q)
{
listBox1.Items.Add(v.Value);
}
}
}
这是BL的初始值:
| Id | Value | Date
+-------+-------+------------
| 11105 | 1 | 01/01/2001
| 11106 | 2 | 01/01/2001
| 11107 | 3 | 02/01/2001
第一次运行时,输出cosole显示:
[t0].[id], [t0].[Value], [t0].[Date]
FROM [dbo].[temptbl] AS [t0]
WHERE [t0].[Date] = @p0
-- @p0: Input DateTime (Size = -1; Prec = 0; Scale = 0) [01/01/2001 00:00:00]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.8.4084.0
这是有道理的
2001年1月1日,我有以下值:[1,2]
现在我提前一天,然后手动添加(使用SSMS)一条新记录:[11108,4,01/01/2001]。
如果我回去,现在我有了值[1,2,4]。还可以
我再次继续,然后将值[11105,1,01/01/2001]更改为[11105,10,01/01/2001]。
当我返回时,预期值是[10,2,4],但我仍然有[1,2,4]
由于缓存,插入(和删除)的记录被正确跟踪,而修改的记录不会被刷新
正如其他SO问题中所建议的,我尝试使用datacontext.Refresh,但我不确定如何正确应用它
如果以这种方式修改代码:
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, dc.temptbl);
var q = from v in dc.temptbl where v.Date == curDate select v;
var q = from v in dc.temptbl where v.Date == curDate select v;
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, q);
或者这样:
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, dc.temptbl);
var q = from v in dc.temptbl where v.Date == curDate select v;
var q = from v in dc.temptbl where v.Date == curDate select v;
dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, q);
结果是正确的,但这是我每次执行查询时在控制台输出中看到的结果(2001年1月1日,不同日期的输出类似):
如果我理解正确,有:
- 具有[Date=01/01/2001]的查询
- 前一查询中每个结果的查询
- 另一个查询为[Date=01/01/2001]