Pergunta

Vamos dizer que eu tenho um modelo de domínio com uma classe chamada Blog que tem uma propriedade chamada BlogEntries (que contém objetos do tipo blogentry). Se eu tiver um modelo de banco de dados com duas mesas de "blog" e "blogentry", não é impossível que eu tenho 1000 entradas de blog para um blog. Se eu fosse para mostrar o blog em um site, eu só gostaria de exibir talvez 20 entradas de blog em um momento, então eu teria que usar algum tipo de paginação. Eu, obviamente, não quer que 1000 registros de ser obtida a partir do DB o tempo todo.

Como é que eu vou fazer isso? Caso a propriedade BlogEntries mesmo estar no objeto do domínio Blog, ou talvez no repositório? Eu ainda gostaria de ter a possibilidade de adicionar entradas de blog, bem como nos preparando uma paginada resultado das já existentes. Qual seria a aparência de mapeamento NHibernate como?

O Blog / blogentry coisa é apenas um exemplo, ele poderia muito bem ter sido um cliente / Order exemplo, ou qualquer outro cenário de mestre / detalhes.

Por favor, me ilumine!

Foi útil?

Solução

Eu faria blogentry a sua própria raiz agregada, com o seu próprio repositório. Você iria obter instâncias blogentry para um blog em particular, consultando o repositório blogentry para todos blogentry do que ter um determinado blogid. Eu não pode fornecer detalhes sobre o repositório além do que uma vez que existem várias estratégias diferentes para repositórios de execução (um repositório genérico vs muitos, métodos localizadores separados contra aquele que pega um objeto de especificação complexa, etc). O método finder do repositório deve suportar paginação.

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
    }
}

Como alternativa, (também com blogentry modelado como uma raiz agregado) você pode adicionar uma coleção de BlogEntryIDs a sua classe Blog. Isso seria melhor do que ter as instâncias blogentry próprios na classe Blog que você teria muito menos dados para carregar quando você deseja obter uma instância Blog. Com essas identificações, você pode selecionar um subconjunto de-los e passá-los em um método de repositório blogentry que aceita uma coleção de IDs. Em outras palavras, haveria um pouco mais lógica em seu domínio para suportar o paging e um getter mais genérico no repositório.

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
    }
}

Uso para esta abordagem seria como

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

No banco de dados, você iria retornar várias linhas, uma para cada entrada de blog. (Eu também prefiro retornar vários conjuntos de resultados para obter todas as linhas de todas as tabelas relacionadas em um banco de dados de ida e volta. Eu também fazer uso da função ROW_VERSION SQL 2005 da para permitir paginação banco de dados.)

I geralmente preferem o segundo método, a menos que os espectáculos típicos de uso proibitivo quantidades de (por exemplo, mais do que um par mil) instâncias blogentry associados com um Blog. Uma matriz de muitos de int me faria Desconfie de desempenho e memória.

Outras dicas

Você tem que acessar no blog em seu próprio repositório para obter uma lista paginada.

Edit: Por downvote? Isso é errado?

Para a coleta de entradas de blog que você poderia usar BatchSize atributo . Ele permitirá que você para não selecionar toda a colecção a partir da base de dados, somente os valores necessários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top