2017-08-17 22 views
0

EntityFramework.Filtersパッケージを使用して、いくつかのデフォルトおよびダイナミクスフィルタをエンティティに設定しています。うまくいきますが、Q:新しいフィルタパラメータを動的に設定すると、最初の値を設定したまま無視されますEntityFramework.Filters動的パラメータ

デバッグモードでは、CultureHelper.GetCurrentCulture().Keyは新しいカルチャセットを正常に返していますが、フィルタパラメータは設定されていますが、何も起こりません。 OnModelCreationを上げた

私だけOnModelCreationを引き起こし、コンストラクタでフィルタを、有効にする前に、任意のContextプロパティにアクセスすることで、この問題を再現することができ

public partial class DataModel : DbContext 
{ 
    public DataModel() : base("name=DataModel") 
    { 
      var currentLanguageId = CultureHelper.GetCurrentCulture().Key; 
      this.EnableFilter("HideDeleted"); 
      this.EnableFilter("CurrentLanguage").SetParameter("currentLanguageId", currentLanguageId); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     DbInterception.Add(new FilterInterceptor()); 
     modelBuilder 
      .Conventions 
      .Add(
       FilterConvention.Create<IDeleted, int>("HideDeleted", (e, Deleted) => e.Deleted == false), 
       FilterConvention.Create<ILanguage, long>("CurrentLanguage", (e, currentLanguageId) => e.LanguageId == currentLanguageId) 
      ); 
    } 
} 
+0

'currentLanguageId'静的変数を作成して渡す代わりに使用しようとしましたか? – ASpirin

+0

はい私は@ASpirinをスタティックとして完全に使用しました。フィルタパラメータは最初の値のみを考慮しています。 –

+0

'CultureHelper.GetCurrentCulture()'のコードは何ですか? – ASpirin

答えて

1

コードを上昇させる、後にセットアップフィルタへの可能性はありませんOnModelCreationをデバッグし、フィルタを有効にする前にModelCreationの原因を定義します。ブレークポイントをコンストラクタとOnModelCreationに設定すると、実際に起動するのはOnModelCreationとなります。

フィルタリングはオブジェクトのセットに適用されます。インタセプタは、コンテキストセット属性See dude Expression variableに基づいて構築されます。私はあなたが関連商品の検索をしていると思います。この場合、Device.Descriptionsのようなものは、傍受することなくすべての関連レコードを返します。

カスタムハードコーディングされた値を使用している場合は、フィルタにThread.CurrentThread.CurrentCulture.LCIDを使用することをお勧めします。これは標準化され、アプリケーションフィルタで言語を変更すると同時に変更されます。

+0

私はすべてのアプローチと提案をできるだけ早く投稿し、あなたの投稿にフィードバックします。ありがとうございました。 –

+0

ご迷惑をおかけしました。私はここでたくさんのテストを行いました。私は、EnableFilterを何回行っても、これと組み合わせてOnModelCreationがカウントされていると推測しました。私が推論したもう一つのことは、 'Thread.CurrentThread.CurrentCulture.LCID'または' CultureHelper.GetCurrentCulture().Key'または '' AnyStaticValue''を使用するかどうかに関わらず、最初の値は唯一のフィルタです。フィルターを変更しなければならないときに 'OnModelCreation'を再実行する方法は1つしかありません。それは可能ですか? –

+0

申し訳ありませんがあなたのアイデアを得ていない?私は次の日にあまり時間がありませんか? aspirin.gm(at)gmail.comに問題があるショットプロジェクトを私に送ってもらえますか?私は時間があるときに見ていきます – ASpirin

関連する問題