У меня есть 2 классов с один-ко-многим, как это:Как не повторять правила доступа к данным в .NET MVC3 с использованием EF (шаблон хранилища)?
public class Parent
{
public virtual List<Child> Children {get; set;}
}
Я также с использованием классов хранилища для каждой модели, т.е.
Родитель имеет собственный класс репо, который имеет Get (), которая может получить упорядоченный список родителей.
Ребенок также имеет свой собственный класс репо, который является функцией Get(), которая может получить упорядоченный список детей, имеющих статус Active.
Проблема в том, как работает EF, поскольку родитель имеет ссылку на детей, EF загружает детей автоматически при загрузке родительского списка, но он становится активным и неактивным. Дети (также список детей не упорядочен). Проверка активного статуса выполняется только в репозитории Child.
Как я могу ограничить свое повторение правил «получить», которые будут использоваться везде, где доступны дети.
Я знаю, что я могу просто изменить родительский репозиторий также проверить состояние ребенка = Active, но я повторяю свою логику в каждом классе, есть дети ...
Edit: У меня есть класс Repository для ребенка, который возвращает a Приведенный список детей:
public List<Children> GetList()
{
IQueryable<Children> query = context.Set<Children>();
return query.OrderBy(a=>a.Seq).ToList();
}
Это прекрасно работает, когда мне просто нужно напрямую обратиться к детям. Но когда мне нужно, чтобы получить родительский класс, я использую функцию репо ниже:
ParentRepo GetByID:
public Parent GetByID(object id)
{
IQueryable<Parent> query = context.Set<Parent>();
Parent parentModel = context.Parents.Where(a => a.ParentId == (int)id)
.Select(a => new
{
Parent = a,
Children = a.Children.OrderBy(b => b.Seq)
}).ToList()
.Select(q => q.Parent)
.Single();
return parentModel;
}
Как вы можете видеть, я должен был заказать здесь детей, а также (по послед).
Это единственный способ, которым я могу придумать эту работу, но это не кажется правильным.
public Parent GetByID(object id)
{
IQueryable<Parent> query = context.Set<Parent>();
Parent parentModel = context.Parents.Single(a => a.ParentId == (int)id);
parentModel.Children = childRepo.GetList(id);
return parentModel;
}
Вы всегда хотели бы получить Активные Дети? –
Только если я получаю их через родительский – getit
Вы можете добавить унаследованный объект, такой как «ActiveChild» (сопоставленный с дочерней таблицей, когда Active = true), и связать это с родителем. –