C# EntityFramework.Filters动态参数
我使用这个包为我的实体设置一些默认值和动态过滤器。它工作得很好,但是问:当我动态设置一个新的过滤器参数时,它会被忽略,保持第一个值集 在调试模式下,C# EntityFramework.Filters动态参数,c#,entity-framework,C#,Entity Framework,我使用这个包为我的实体设置一些默认值和动态过滤器。它工作得很好,但是问:当我动态设置一个新的过滤器参数时,它会被忽略,保持第一个值集 在调试模式下,CultureHelper.GetCurrentCulture().Key正确返回新的区域性集,正在设置筛选器参数,但什么也没有发生 代码 公共部分类数据模型:DbContext { public DataModel():base(“name=DataModel”) { var currentLanguageId=CultureHelper.GetC
CultureHelper.GetCurrentCulture().Key
正确返回新的区域性集,正在设置筛选器参数,但什么也没有发生
代码
公共部分类数据模型:DbContext
{
public DataModel():base(“name=DataModel”)
{
var currentLanguageId=CultureHelper.GetCurrentCulture().Key;
此.EnableFilter(“隐藏删除”);
此.EnableFilter(“CurrentLanguage”).SetParameter(“currentLanguageId”,currentLanguageId);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
添加(新的FilterInterceptor());
建模者
.公约
.添加(
FilterConvention.Create(“hiddedeleted”,(e,Deleted)=>e.Deleted==false),
创建(“CurrentLanguage”,(e,currentLanguageId)=>e.LanguageId==currentLanguageId)
);
}
}
我只能通过在构造函数中启用筛选器之前访问任何上下文属性来重现此问题,这会导致引发OnModelCreation
,在引发OnModelCreation
后,无法设置筛选器。在启用筛选之前,在ModelCreation上调试您的,并定义导致模型创建的原因。只需将断点设置为Constructor和OnModelCreation
,您将看到OnModelCreation
何时实际启动
过滤将应用于对象集。拦截器是基于上下文集属性构建的。我想您正在检索相关项目。类似于Device.Descriptions
的内容,在这种情况下,它将返回所有相关记录,而不进行拦截
如果您使用的是自定义硬编码值,则最好在过滤器中使用Thread.CurrentThread.CurrentCulture.LCID
,这将被标准化,如果应用程序中的语言发生变化,过滤器将同时被更改 您是否尝试过创建currentLanguageId
静态变量并使用它而不是传递?是的,我尝试过@ASpirin,使用as static非常有效。筛选器参数仅考虑第一个值集。在CultureHelper.GetCurrentCulture()下的代码是什么?
正是这个公共静态键值对GetCurrentCulture(){var currentCultureCode=Thread.CurrentThread.CurrentCulture.Name;var CurrentCulture=\u cultures.Where(c=>c.Value==currentCultureCode).FirstOrDefault();return CurrentCulture;}
你不认为访问\u文化
会迫使模型创建
吗?我会尽快尝试所有方法和建议,并反馈你的帖子。谢谢。很抱歉反应太晚。我在这里做了很多测试,我推断无论我们启用过滤器
多少次,重要的是模型创建代码>与此相结合。我推断的另一件事是,无论我使用线程.CurrentThread.CurrentCulture.LCID
还是文化帮助.GetCurrentCulture().Key
或“AnyStaticValue”
,第一个值都是唯一考虑的过滤器。我想只有一种方法可以“修复”它-当我们必须更改过滤器时,重新运行ModelCreation上的
。这可能吗?对不起,没有你的想法?我下几天没有太多时间了?你能给我发一个在Aspiri.gm(at)有问题的快照项目吗gmail.com。等我有时间再看一看。我已经尝试过存储modelBuilder并在一次之后初始化过滤器,但没有帮助。唯一的问题是在引发OnModelCreation
之前应该启用过滤器。你应该定义谁触发了该调用,并完全摆脱@Aspirin!但这就是问题所在de>OnModelCreation
只运行一次。在执行之前设置过滤器,过滤器会按预期工作。问题是,在执行OnModelCreation
之后,我可能必须更改过滤器值。因此,我找到了一种可能的解决方法执行System.Web.HttpRuntime.UnloadAppDomain()
我一直都在更换过滤器。我仍然不知道这是否是一个好方法,顺便说一句,它起作用了。我非常感谢你的帮助。
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)
);
}
}