私は非常に具体的な何かに出くわして、そこにいる誰かが同じ問題に直面しているのか疑問に思いました。 (ストアドプロシージャで)Entity Framework 7の奇妙なキャッシングの問題
私のSQLクエリはシンプルですが、私はそれを少ししかし、簡略化されました:
BEGIN
SELECT DISTINCT
[ANU].[OldUserId] AS [ID]
,[ANU].[Email]
FROM
[dbo].[AspNetUsers] AS [ANU]
INNER JOIN
[dbo].[User] AS [U]
ON
[U].[ID] = [ANU].[OldUserId]
END
かなりシンプルに、そしてSQL Management Studioを介して直接実行するとSPは大丈夫です。
はしかし、私のようなエンティティフレームワークを経由して、それを実行します。
[ResponseCache(Duration = 0)] // used this out of desperation
public List<DriverDTO> GetByOrganisation(int organisationId, bool isManager)
{
return _context.Set<DriverDTO>().FromSql("dbo.New_User_List @OrganisationId = {0}, @IsManager = {1}", organisationId, isManager).ToList();
}
DriverDTO:
public class DriverDTO
{
[Key] // tried removing this also
public int ID { get; set; }
public string Email { get; set; }
}
それが実行され、罰金、結果を持ち帰ります。しかし、これらの結果はキャッシュに入れられています。最初の呼び出し後にSPを呼び出すたびに、レコードを更新しても同じ結果が返されます。だから、私はユーザーのレコードを編集し、電子メールを変更する - 元々フェッチされた電子メールは常に戻ってくると言う。
また、SQLマネージャを使用してSPを実行すると、正しい結果が得られますが、C#/ EF側には反映されません。ここで私の頭の中で唯一の論理的なことは何かが何とか私が必死に周りに行く必要があるフードの下にキャッシュされているということです!
あなたは今日、私のベーコンを大きなものに保存しました、ありがとうございます! .AsNoTracking()関数は、私のために絶対的な治療をしてくれました。私のシナリオでは、最も単純な方法です。私はこれが他人にも役立つことを願っています –
@ChrisDixon喜んで助けました。副次的な問題として、 'AsNoTracking'クエリは、通常のEFクエリよりメモリが半分以下で、はるかに高速です。(基本的には、あなたのコンテキストがクエリにのみ使われ、更新/削除には使われません) – Jcl
賢明なアドバイス。毎日何か新しいことを学び、私のシステムを劇的にスピードアップします! –