当前位置: 首页 > 编程语言 > C#

为实体框架做一个全局过滤器分享

时间:2023-04-10 23:34:58 C#

为实体框架做一个全局过滤器对于我的模型,我在所有模型上都有一个active属性,如果模型没有显示在admin中,我想过滤所有非活动状态。什么是最好的方法,我目前正在使用以下方法在我的基本模型类中,我有这种过滤集合的方法publicvirtualIQueryableGlobalDefaultScope(IQueryablec)whereT:CModel{if(settings.is_admin){c=c.Where(m=>m.active);}返回c;在我的每个关系模型上,我执行了以下方法DbSetset...varX=set.Where(somefilter);varlist=globalDefaultScope(X).ToList();返回列表;现在我遇到了一些严重的问题,当我想使用include("Xmodel.Ymodel")急切地加载一些子关系时,我在该集合的get方法中调用了globalDefaultScope来过滤集合,但是当一些集合中的项不活动System.InvalidOperationException:操作失败:无法更改关系,因为一个或多个外键属性不可为空。我怎样才能解决这个问题,或者我怎样才能以更优雅的方式制作这个过滤器,因为我对我的实现方式真的不太满意。请询问任何丢失的信息或代码块或任何详细信息更新:我也找到了这个链接,但这种方式不适用于急切加载的条目(include())更新2:这是我如何使用包含和错误的示例发生在我的模型中publicIQueryablegetSomeRelation(booleagerly_load_sub_relation1,booleagerly_load_sub_relation2){//getQuery=>query=db.Entry(obj).Collection(collection).Query()//GlobalDefaultScope(query)if(eagerly_load_sub_relation1){query=query.Include(m=>m.sub_relation1);}if(eagerly_load_sub_relation2){query=query.Include("sub_relation2.sub_relation_of_sub_relation2");为了过滤包含的关系,我做了以下事情:privateICollection_sub_relation1{get;set;}publicICollectionsub_relation1{get{//类似的东西:returnGlobalDefaultScope(_sub_relation1).ToList();}set;}当我们在sub_relation1过滤结果时,当我做db.SaveChanges()时,抛出了上面的错误。您可以创建扩展方法,例如publicstaticIQueryableWhere(thisIQueryablesource,Expression>predicate){source=source.Where("isActive==true");//来自System.linq.Dynamic库source=Queryable.Where(source,predicate);返回源;}并使用它们varuser=db.UserProfiles.Include("webpages_Roles").Where(u=>u.UserId这应该有效,如果您需要更多信息,请告诉我。注意:请为System.Linq添加Nuget包。动态获取动态Linq库更新1:我在简单成员资格中包含了来自webAages_Roles和UsreProfile表的IsActive,还包含了一个表RolePriority,它指的是webpages_Roles,为了便于使用,我已将所有关系更改为一对多(从多对多)。现在,如果我使用类似于你的代码,当有任何用户没有角色时,扩展方法会出错。如果我给每个用户角色,并且我有每个角色的优先级,那么这个不会报错。如果您需要任何其他信息,请告诉我。更新2您可以创建一个扩展方法publicstaticIQueryableWhereActive(thisIQueryablesource){returnsource.Where("isActive==true");//来自System.linq.DynamicLibrary}并调用其他方法,例如varuser=db.UserProfiles.Include("webpages_Roles").WhereActive().Where(u=>u.UserId或varuser=db.UserProfiles.Include("webpages_Roles").WhereActive().FirstOrDefault(u=>u.UserId如果您需要任何其他信息,请告诉我。您可以这样做:在OnModelCreating中,为每个可以软删除的实体添加一个IsDeleted鉴别器覆盖SaveChanges并找到要删除的所有条目在这些条目上运行SQL以设置IsDeleted鉴别器,然后将其状态设置为“分离”更改任何唯一索引以忽略任何软删除记录您可以在此答案中找到工作代码:HowtosoftdeletewithEntityFrameworkCodeFirst以上就是关于学习C#教程:实体框架制作全局过滤器的全部内容分享,如果对你有用,需要进一步了解C#学习教程,希望大家多加关注————本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: