我正在使用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)
);
}
}
答案 0 :(得分:1)
我只能通过在构造函数中启用过滤器之前访问任何Context属性来重现此问题,这会导致OnModelCreation
被引发,在OnModelCreation
被引发后无法设置过滤即可。调试OnModelCreation
,并在启用过滤器之前定义导致ModelCreation
的原因。只需在构造函数和OnModelCreation
中设置断点,您就会看到OnModelCreation
实际启动的时间。
过滤应用于对象集。 Interceptor基于上下文Set属性See dude Expression variable构建。我想你正在检索相关的项目。在这种情况下,它会像Device.Descriptions
那样返回所有相关记录而不会被拦截。
如果您使用自定义硬编码值,最好在过滤器中使用Thread.CurrentThread.CurrentCulture.LCID
,这将是标准化的,如果应用过滤器中的语言更改将在同一时间更改。