我使用EntityFramework.Filters包来为我的实体设置一些缺省值和动态过滤器。它运行得很好,但是Q:当我动态设置一个新的筛选器参数时,它将被忽略,保持第一个值集。
在调试模式下,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)
);
}
}发布于 2017-08-17 19:21:45
在启用构造函数中的筛选器之前,我只能通过访问任何上下文属性来再现这个问题,这会导致OnModelCreation被引发,而在被提出之后,就不可能设置过滤器。调试OnModelCreation,并在启用筛选之前定义导致ModelCreation的原因。只需将断点设置为Constructor和OnModelCreation,您就会看到OnModelCreation何时真正启动。
过滤应用于一组对象。拦截器是基于上下文集属性见“花花公子”表达式变量构建的。我想你是在检索相关的物品。类似于Device.Descriptions,在这种情况下,它返回所有相关记录而不被拦截。
如果您使用的是自定义硬编码值,最好在筛选器中使用Thread.CurrentThread.CurrentCulture.LCID,这将被标准化,如果应用程序过滤器中的语言发生变化,则在同一时刻会更改。
https://stackoverflow.com/questions/45742764
复制相似问题