2017-07-11 253 views
1

我有一个Windows窗体。我在窗体的构造函数中创建了我的数据上下文。当我点击一个按钮时,我想显示有关文章的信息。数据可以在外部更新。问题在于,在这种情况下,数据不会刷新。Linq to SQL FirstOrDefault不执行SQL查询

我已经知道每次重新创建我的数据上下文是一个选项。 ToList将强制刷新数据。但我真的认为FirstOrDefault()会每次执行SQL ...

我做了一些日志,事实并非如此。那里有一个选项来强制执行SQL吗?这里有缓存吗?

using (var log = new System.IO.StreamWriter("D:\\LOG.TXT", true)) 
{ 
    DB.Log = log; 

    var article = DB.T_Articles.FirstOrDefault(x => x.NumArticle == 11); 
    MessageBox.Show(article.Description); 

    var articles = DB.T_Articles.ToList(); 

    log.WriteLine("----------------------------------"); 

    DB.Log = null; 
} 

这是日志文件。我们可以看到FirstOrDefault方法背后的SQL在这里。我们可以看到,它消失了,第二次

SELECT TOP (1) [t0].[NumArticle], [t0].[EAN13], [t0].[Minimum], [t0].[Emplacement], [t0].[Fournisseur], [t0].[Qte], [t0].[Description], [t0].[Photo], [t0].[Prix], [t0].[IsEmail] 
FROM [dbo].[T_Article] AS [t0] 
WHERE [t0].[NumArticle] = @p0 
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [11] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.7.2046.0 

SELECT [t0].[NumArticle], [t0].[EAN13], [t0].[Minimum], [t0].[Emplacement], [t0].[Fournisseur], [t0].[Qte], [t0].[Description], [t0].[Photo], [t0].[Prix], [t0].[IsEmail] 
FROM [dbo].[T_Article] AS [t0] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.7.2046.0 

---------------------------------- 
SELECT [t0].[NumArticle], [t0].[EAN13], [t0].[Minimum], [t0].[Emplacement], [t0].[Fournisseur], [t0].[Qte], [t0].[Description], [t0].[Photo], [t0].[Prix], [t0].[IsEmail] 
FROM [dbo].[T_Article] AS [t0] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.7.2046.0 

---------------------------------- 
+0

您使用什么工具基于执行SQL生成该日志文件?如果您运行SQL跟踪,您是否看到多次执行TOP 1查询? – mjwills

+1

请显示'T_Articles'的代码。 – mjwills

+0

@mjwills我使用了一个dbml文件我不确定这会有所帮助。 TOP(1)只是第一次出现 – pjaaar

回答

3

您可以尝试每次刷新您的上下文FirstOrDefault()之前:

Context.Refresh(RefreshMode.StoreWins, [table_name]); 
1

您可以重新加载找到的条目,阅读更多关于cache busting

var article = DB.T_Articles.FirstOrDefault(x => x.NumArticle == 11); 
    DB.Entry(article).Reload(); 
+0

非常有趣的链接!我没有和EF tho一起工作 – pjaaar