Pregunta

Digamos que tengo un modelo de dominio con una clase llamada Blog que tiene una propiedad llamada BlogEntries (que contiene objetos de tipo BlogEntry). Si tengo un modelo de base de datos con dos tablas " Blog " y " BlogEntry " ;, no es imposible que tenga 1000 entradas de blog para un blog. Si tuviera que mostrar el blog en un sitio web, solo querría mostrar quizás 20 entradas de blog a la vez, así que tendría que usar algún tipo de paginación. Obviamente no quiero que se busquen 1000 registros del DB todo el tiempo.

¿Cómo voy a hacer eso? ¿Debería la propiedad BlogEntries incluso estar en el objeto de dominio de Blog, o tal vez en el repositorio? Todavía me gustaría tener la posibilidad de agregar entradas de blog, así como obtener un resultado paginado de los existentes. ¿Cómo sería el mapeo de NHibernate?

Lo de Blog / BlogEntry es solo un ejemplo, bien podría haber sido un ejemplo de Cliente / Pedido o cualquier otro escenario maestro / detalle.

¡Por favor, ilumíname!

¿Fue útil?

Solución

Haría que BlogEntry fuera su propia raíz agregada, con su propio repositorio. Obtendría instancias de BlogEntry para un Blog en particular si consulta el repositorio de BlogEntry para todas las BlogEntry que tienen un BlogID dado. No puedo proporcionar detalles sobre el repositorio más allá de eso, ya que existen varias estrategias diferentes para implementar repositorios (un repositorio genérico frente a muchos, métodos de búsqueda separados versus uno que toma un objeto de especificación compleja, etc.). El método del buscador del repositorio debe admitir la paginación.

public class Blog
{
    public int ID {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> FindByBlogID(
        int blogID, int pageIndex, int pageSize) 
    {
        // implementation
    }
}

Alternativamente, (también con BlogEntry modelado como una raíz agregada), podría agregar una colección de BlogEntryIDs a su clase de Blog. Esto sería mejor que tener las instancias de BlogEntry en la clase Blog, ya que tendría menos datos para cargar cuando desee obtener una instancia de Blog. Con esos ID, puede seleccionar un subconjunto de ellos y pasarlos a un método de repositorio de BlogEntry que acepte una colección de ID. En otras palabras, habría un poco más de lógica en tu dominio para admitir la paginación y un captador más genérico en el repositorio.

public class Blog
{
    public int ID {get;set;}
    public IEnumerable<int> BlogEntryIDs {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    {
        // implementation
    }
}

El uso de este enfoque sería como

// get the second page
var entries = 
  blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);

En la base de datos, devolvería varias filas, una para cada entrada de blog. (También prefiero devolver varios conjuntos de resultados para obtener todas las filas de todas las tablas relacionadas en un viaje de ida y vuelta a la base de datos. También uso la función ROW_VERSION de SQL 2005 para habilitar la paginación de la base de datos).

Generalmente prefiero el segundo método, a menos que el uso típico muestre cantidades prohibitivas de (por ejemplo, más de un par de miles) de instancias de BlogEntry asociadas con un Blog. Un conjunto de demasiados int's me haría desconfiar del rendimiento y la memoria.

Otros consejos

Tienes que acceder a la entrada de blog en su propio repositorio para obtener una lista paginada.

Editar: ¿Por qué downvote? ¿Está esto mal?

Para la colección de entradas de blog, puede utilizar BatchSize atributo. Le permitirá no seleccionar toda la recopilación de la base de datos, solo los valores requeridos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top