0

У меня есть 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; 
    } 
+0

Вы всегда хотели бы получить Активные Дети? –

+0

Только если я получаю их через родительский – getit

+0

Вы можете добавить унаследованный объект, такой как «ActiveChild» (сопоставленный с дочерней таблицей, когда Active = true), и связать это с родителем. –

ответ

0

Хранилище модели абстрагирует слой доступа к данным, так что остальная часть приложения не зависит от деталей реализации ДАЛ. Репозиторий должен быть построен в соответствии с потребностями приложения. В основном вы должны создать интерфейс репозитория с точки зрения приложения, и репозиторий должен вернуть объекты домена/бизнес.

Если я правильно понимаю, что вы делаете, вы пытаетесь построить репозитории вокруг EF, что дает вам такие проблемы.

Возможно, я неправильно понял, и это может быть просто проблема, связанная с EF, но мне кажется, что проблема в неправильном дизайне репозитория.