Как загружать дочерние объекты с помощью шаблона репозитория

У меня есть объект с именем Tour , в котором может быть много агентов . Я могу добавлять агентов, но не могу их удалить.

// _repo is injected....
var tour = _repo.GetById(tourId);
tour.AddAgent(new Agent(tour.TourId));

Когда я пытаюсь вызвать Tour.RemoveAgent () , на самом деле ничего не удаляется Я установил точку останова внутри метода Tour.RemoveAgent () Я вижу, что свойство _agents имеет счетчик 0 .

tour.RemoveAgent(agentId); // This doesn't work because _agents is empty

Нужно ли мне делать что-то особенное, чтобы EF заполнял свойство _agents , когда я извлекаю Tour из своего репозитория?

ОБНОВЛЕНИЕ: ПРОБЛЕМА РЕШЕНА (благодаря ответу Пола)

Я решил просто создать репозиторий, уникальный для каждого агрегата, чтобы было легко определить, что именно нужно включить, используя функцию Include () . Это пример, в котором я наследую от GenericRepository класс (whic h также включен в конец этого вопроса).

public class TourRepository : GenericRepository<Tour>
{
    public TourRepository(IDatabaseFactory databaseFactory) : base (databaseFactory)
    {
    }

    public override Tour GetById(Guid id)
    {
        return dataContext.Tours
                .Include(x => x.Agents)
                .Single(x => x.TourId == id);
    }
}

Класс обхода

public partial class Tour
{
  public Guid TourId { get; private set; }
  protected virtual List<Agent> _agents { get; set; }

  public Tour()
  {
    TourId = Guid.NewGuid();
    _agents = new List<Agent>();
  }

  public void AddAgent(Agent agent)
  {
    _agents.Add(agent);
  }

  public void RemoveAgent(Guid agentId)
  {
    _agents.RemoveAll(a => a.AgentId == agentId);
  }
}

Класс агента

public partial class Agent
{
  public Guid AgentId { get; private set; }
  public Guid TourId { get; private set; }
  public Tour Tour { get; private set; }

  public Agent(Guid tourId)
  {
    TourId = tourId;
    AgentId = Guid.NewGuid();
  }
}

OnModelCreating

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  // AGENTS ============================
  modelBuilder.Entity<Agent>()
              .HasKey(x => x.AgentId)
              .Property(p => p.AgentId);

  modelBuilder.Entity<Agent>()
              .HasRequired(p => p.Tour)
              .WithMany(t => t.Agents);

  // TOURS =============================
  modelBuilder.Entity<Tour>()
              .HasKey(x => x.TourId)
              .Property(x => x.TourId);
}

Класс репозитория

public class GenericRepository<T> : IRepository<T> where T : class {
  private MyContext dataContext;
  private readonly IDbSet<T> dbset;  

  public GenericRepository(IDatabaseFactory databaseFactory)
  {
    DatabaseFactory = databaseFactory;
    dbset = DataContext.Set<T>();
  }

  protected IDatabaseFactory DatabaseFactory
  {
    get;
    private set;
  }

  protected MyContext DataContext
  {
    get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
  }

  // ... stuff removed for brevity ...

  public T GetById(Guid id)
  {
    return dbset.Find(id);
  }
}
6
задан jessegavin 17 March 2011 в 19:23
поделиться