对于我的模型,我active
对所有模型都有一个属性,如果模型未显示在管理中,我想过滤所有不活动的模型什么是最好的方法,我目前使用的是以下
在我的基础模型类中,我有这个过滤集合的方法
public virtual IQueryable<T> GlobalDefaultScope<T>(IQueryable<T> c) where T : CModel<T>
{
if (settings.is_admin)
{
c = c.Where(m => m.active);
}
return c;
}
在我的每个关系模型上,我做了以下方法
DbSet<T> set ...
var X = set.Where(some filter);
var list = globalDefaultScope(X).ToList();
return list;
include("Xmodel.Ymodel")
现在,当我想急切地加载一些子关系时,我遇到了一些严重globalDefaultScope
的get
问题
System.InvalidOperationException: 操作失败:无法更改关系,因为一个或多个外键属性不可为空。
我该如何解决这个问题,或者如何以更优雅的方式制作这个过滤器,因为我真的对我如何实现它不太满意。
请询问任何缺失的信息或代码块或任何细节
更新:
我也找到了这个链接,但是这种方式不适用于急切加载的条目(include()
)
更新2:
这是我如何使用包含以及错误发生位置的示例
在我的模型中
public IQueryable<Dish> getSomeRelation(bool eagerly_load_sub_relation1, bool eagerly_load_sub_relation2)
{
var query = getQuery(...);
//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");
}
return query;
}
虽然我无法过滤包含中的关系,但我执行了以下操作:
private ICollection<SubRelation1> _sub_relation1 {get; set;}
public ICollection<SubRelation1> sub_relation1 {
get
{
//something like:
return GlobalDefaultScope(_sub_relation1 ).ToList();
}
set;}
当我们过滤 sub_relation1 中的结果时,当我执行 db.SaveChanges() 时,会抛出上述错误。