What is best practise for repository pattern - repo per table?
The repository pattern seems to work well when working with an initial project with several large main tables.

However as the project grows it seems a little inflexible. Say you have lots of child tables that hang off the main table, do you need a repository for each table?

E.g.

CustomerAddress Record has following child tables:

-> County

-> Country

-> CustomerType

On the UI, 3 dropdown lists need to be displayed, but it gets a bit tedious writing a repository for each of the above tables which selects the data for the dropdowns.

Is there a best practice/more efficient way of doing this?

As an example say you have a main CustomerAddress repository which I guess is the 'aggregate root' which inherits the main CRUD operations from the base repo interface.

Previously I have short-cutted the aggregate root and gone straight to the context for these kinds of tables.

e.g.

    public IEnumerable GetCustomerById(int id)
    {
      return Get(id);
    }
    
    public IEnumerable GetCountries()
    {
      return _ctx.DataContext.Countries.ToList();
    }

etc...

But sometimes it doesn't *feel* right, as countries aren't part of the customer, but I feel like I need to tack it onto something without having to create zillions of repos for each table.  A repo per table definately doesn't seem right to me either.



What is best practise for repository pattern - repo per table?
===

The repository pattern seems to work well when working with an initial project with several large main tables.

However as the project grows it seems a little inflexible. Say you have lots of child tables that hang off the main table, do you need a repository for each table?

E.g.

CustomerAddress Record has following child tables:

-> County

-> Country

-> CustomerType

On the UI, 3 dropdown lists need to be displayed, but it gets a bit tedious writing a repository for each of the above tables which selects the data for the dropdowns.

Is there a best practice/more efficient way of doing this?

As an example say you have a main CustomerAddress repository which I guess is the 'aggregate root' which inherits the main CRUD operations from the base repo interface.

Previously I have short-cutted the aggregate root and gone straight to the context for these kinds of tables.

e.g.

    public IEnumerable GetCustomerById(int id)
    {
      return Get(id);
    }
    
    public IEnumerable GetCountries()
    {
      return _ctx.DataContext.Countries.ToList();
    }

etc...

But sometimes it doesn't *feel* right, as countries aren't part of the customer, but I feel like I need to tack it onto something without having to create zillions of repos for each table.  A repo per table definately doesn't seem right to me either.


