2017-08-17 97 views
0

我正在使用EntityFramework.Filters包來爲我的實體設置一些默認和動態過濾器。它運行良好,但問:當我動態設置一個新的過濾器參數時,它將被忽略,並保持第一個值EntityFramework.Filters動態參數

在調試模式下CultureHelper.GetCurrentCulture().Key正確地返回新的文化集,篩選參數正在設置,但沒有任何反應。 OnModelCreation有人提出

代碼

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之前訪問任何Context屬性重現這個問題被提出,後有沒有可能設置過濾器。調試您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」。那可能嗎? –

+0

抱歉沒有得到您的想法?下一天我沒有多少時間?你可能會給我發一個在aspirin.gm(at)gmail.com上有問題的鏡頭項目。我會看看,當我有一段時間 – ASpirin