我认为最初的问题可能过于冗长,包含太多不必要的细节,所以这是我简化的尝试。
我正在寻找一种方法来执行以下任何操作。我只需要做一个,而不是全部。如果有人知道其中之一的答案,请回复。那么,是否可以在 Linq to SQL 中执行以下任何操作:
DataContext
将实体从通孔中拉出ExecuteQuery
还是ExecuteMethodCall
不跟踪这些实体?调用
ExecuteQuery
或ExecuteMethodCall
保证我总是收到从数据库检索到的结果的新副本,即使这些实体已经被检索并且已经在身份缓存中?指示 Linq to SQL 不要对特定实体类型执行任何更改跟踪 - 但仍允许对其他类型进行更改跟踪?
限制:
Refresh
方法是不可能的;实体的数量很大,这将成为性能灾难。我不能简单地设置
ObjectTrackingEnabled
为false
,因为DataContext
不允许true
在执行查询后将其设置回,并且我确实需要跟踪一些实体。我也不能扔掉原来的
DataContext
并使用一个新的;我需要能够在交易过程中做到这一点。
这开始成为一个严重的问题,我真的认为默认行为是错误的。如果我执行临时查询或存储过程,我希望收到的结果与所述查询返回的结果完全相同。这才有意义;如果我想要旧的、陈旧的实体,我为什么要返回数据库来获取它们?
目前,我的解决方法是(a)DataContext
专门为查询创建一个新的并覆盖事务隔离级别,或者(b)将返回类型设置为在各个方面都与实体相同但没有[Table]
属性,并使用 AutoMapper 将其映射到原始实体。这两个似乎都是可怕的黑客。
非常感谢任何人对这个难题的任何建议。