2009-10-15 58 views
0

我没有找到类似的东西认识的变化,所以我必须要问:LINQ不会在数据库

我使用LINQ to SQL和所有被罚款,直到我开始使用存储过程来更新数据库条目。 (我的存储过程就像更新groupid x的所有条目) 更新运行良好,数据库中的值发生更改。但是DataContext忽略了这种改变。

我不得不说,数据上下文是一个单身人士,我知道是不常见的方式,但我有不同的理由,为什么我必须这样做。

所以

db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

没有帮助。

他为什么不知道db的变化?

回答

2

你想要做的事情非常反对LinqToSql的工作方式。

使用长期存在的DataContext很难正确执行,特别是如果您需要调用存储过程,LinqToSql无法轻松跟踪数据更改。

通过DataContext所做的更改通常会自动进行跟踪,因此DataContext可以正确管理其缓存并跟踪从该DataContext对数据库所做的更改。但情况并非总是如此。 DataContext没有(也不能很容易)理解你的存储过程正在做什么,所以它不知道如何保持它的缓存正确。此时,在调用存储过程之后,最好的选择是摆脱DataContext并创建一个新的。这有效地吹走了你的缓存,这可能是也可能不是重大的性能下降,但数据完整性应该是你的主要关注点。如果你的Singleton DataContext不是唯一修改数据库的东西(例如,你的数据库可以通过触发器,批处理,其他应用程序等进行修改),你的DataContext也可能包含不准确的数据它的缓存,这是另一个有短命的DataContext的原因。

所以,虽然你可能成功使用一个长寿命的Singleton DataContext,但你会以整个方式与系统作战,并且系统可能最终赢得胜利。

您必须决定:数据完整性有多重要?

+0

awsome回答!谢谢 – Markus 2009-10-15 13:26:19

2

因为datacontext正在缓存这些值。这里有一篇关于如何clear the cache的文章。但是,现在您遇到了实施知道何时清除通知系统的问题。

Microsoft建议数据上下文应仅用于单个工作单元。挂在它上面作为一个singleton 可能 不是一个好主意。