【发布时间】:2013-09-09 21:14:28
【问题描述】:
对于我的模型,我在所有模型上都有一个 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") 急切地加载一些子关系时,我遇到了一些严重的问题集合中的某些项目处于非活动状态
System.InvalidOperationException: 操作失败:无法更改关系,因为一个或多个 的外键属性不可为空。
我怎样才能解决这个问题,或者我怎样才能以更优雅的方式制作这个过滤器,因为我真的对我的实现方式不太满意。
请询问任何缺失的信息或代码块或任何细节
更新:
我也找到了这个link,但这种方式不适用于急切加载的条目 (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() 时,会抛出上述错误。
【问题讨论】:
-
如果您在不应用过滤器的情况下执行 include() 是否有效,即错误是否消失。你能展示一些如何应用包含的代码吗?
-
@TommyGrovnes 问题已更新,谢谢。
-
@Hilmi 你能否也包括数据库表。(我觉得对于你的第一个关系,你没有得到值,因为可能没有任何数据,你正在尝试获得 null 的第二个关系船)
-
尝试在实体 REST SDK entityrestsdk.codeplex.com 中指定的 SecurityContext
标签: c# asp.net-mvc linq entity-framework