EntityFramework.Filters动态参数

时间:2017-08-17 18:39:35

标签: c# entity-framework

我正在使用EntityFramework.Filters包来为我的实体设置一些默认值和动态过滤器。它运行良好,但是问:当我动态设置一个新的过滤器参数时,它被忽略,保持第一个值设置

在调试模式CultureHelper.GetCurrentCulture().Key正确返回新文化集时,正在设置过滤器参数,但没有任何反应。

代码

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)
            );
    }
}

1 个答案:

答案 0 :(得分:1)

我只能通过在构造函数中启用过滤器之前访问任何Context属性来重现此问题,这会导致OnModelCreation被引发,OnModelCreation被引发后无法设置过滤即可。调试OnModelCreation,并在启用过滤器之前定义导致ModelCreation的原因。只需在构造函数和OnModelCreation中设置断点,您就会看到OnModelCreation实际启动的时间。

过滤应用于对象集。 Interceptor基于上下文Set属性See dude Expression variable构建。我想你正在检索相关的项目。在这种情况下,它会像Device.Descriptions那样返回所有相关记录而不会被拦截。

如果您使用自定义硬编码值,最好在过滤器中使用Thread.CurrentThread.CurrentCulture.LCID,这将是标准化的,如果应用过滤器中的语言更改将在同一时间更改。