Для моих моделей у меня есть атрибут 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: операция не удалась: отношения не могут быть изменены, потому что один или более из внешних ключей свойств не является обнуляемым.
Как я могу исправить это или как я могу сделать этот фильтр более элегантным способом, потому что я действительно не очень доволен тем, как я его реализовал.
пожалуйста, обратитесь к любой пропавшей информации или кодовых блоков или каких-либо деталей
Update:
Я также нашел эту link, но этот способ не работает с нетерпением загруженных записей (include()
)
Обновление2:
это пример того, как я использовать, включают и порога е ошибка происходит
In My Model
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(), указанная ошибка возникает.
Если вы включаемые() без применения фильтра он работает, то есть ли ошибка уходит. Можете ли вы показать код того, как применяется приложение. –
@TommyGrovnes Вопрос обновлен, спасибо. – Hilmi
@ Хильми также можете указать таблицы базы данных. (** Что я чувствую, так это то, что для вашего первого корабля отношения вы не получаете значения, поскольку для этого не может быть никаких данных, и вы пытаетесь получить второе отношение null **) – hajirazin