1

私が抱えている問題は次のとおりです。キャッシュの問題により、すべての ET クエリの開始前に次のものを配置しています。

DataBase.Refresh(System.Data.Objects.RefreshMode.ClientWins, DataBase.PublicUsers);

ただし、上記のコマンドはデータベースに対して 2 つの呼び出しを行うため、ページの読み込みに時間がかかります。

すべてのクエリの前にそのコマンドを配置することなく、EF のキャッシュを停止する方法を知っている人はいますか?

4

2 に答える 2

2

あなたの最初の質問に答えるために。コンテキストでデータをキャッシュしたくない場合は、変更追跡なしでクエリを実行する必要があります。

Database.Hubs.MergeOption = MergeOption.NoTracking;
return DataBase.Hubs
            .Where(h =>
                h.BusinessId == null
                && h.TypeId != (int)HubType.BusinessPlace
                && h.ParentHubId != null
            );

しかし、これは Web アプリの静的/共有コンテキストに関連するアーキテクチャの問題を解決しません。本当に機能するアプリケーションを作成したい場合は、アーキテクチャを変更する必要があります。

于 2012-07-04T16:06:07.993 に答える
0

コンテキストを作成した後、MergeOption をすべての EntitySet に設定できます。このようないくつか:

var objSetProps = ctx.GetType().GetProperties().Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ObjectSet<>));
foreach (PropertyInfo objSetProp in objSetProps)
{
    ObjectQuery objSet = (ObjectQuery)objSetProp.GetValue(ctx, BindingFlags.GetProperty, null, null, null);
    objSet.MergeOption = MergeOption.PreserveChanges;
}

ここで MergeOption について読んでください: http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx NoTracking を使用すると思います。

ただし、「キャッシュされた」エンティティをクリアして、切り離したい場合があります。

var entidades = Ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);
foreach (var objectStateEntry in entidades)
    Ctx.Detach(objectStateEntry.Entity);

Ctx は私のコンテキストです。

于 2014-04-02T17:28:55.313 に答える