私のモデルでは、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: 操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。
どうすればこれを修正できますか、またはこのフィルターをより洗練された方法で作成するにはどうすればよいですか。なぜなら、実装方法にあまり満足していないからです。
不足している情報、コード ブロック、または詳細についてお尋ねください
アップデート:
このリンクも見つけましたが、この方法では熱心に読み込まれたエントリでは機能しませんでした ( 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() を実行すると、前述のエラーがスローされます。