Pergunta

Eu quero usar algumas das pesquisas pré-definidas sem roundrips ao banco de dados em NHibernate.

Basicamente, eu gostaria de ter um código como este:

public class Countries
{
  static Countries() {
    Australia = new Country
      {
          Id = 14,
          Description = "Australia"
      }
  }
  public static Country Austrlia { get; protected set }
}

Em seguida, escreva este trechos de código:

address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
  // Do something
}

Então eu faço substituir Equals, GetHashCode e mesmo operadores sobrecarregar == e! = Para pesquisa de classe País.

O Snippet1 funciona apenas se o país com determinada ID não foi carregado na memória. Caso contrário, ele lança NonUniqueObjectException dizendo o objeto com determinado ID já está em memória.

Para workaraound isso eu tenho que expulsar o país carregado e, em seguida, atribuir o valor de pesquisa. Este parece errado e eu não tenho certeza do que vai acontecer quando a consulta para pesquisa País será executado novamente.

Assim, a pergunta é: Como manter as classes de pesquisa estáticos em NHibernate

Obrigado, Dmitriy.

Foi útil?

Solução 2

Parece NHibernate não pode lidar com 2 objetos logicamente os mesmos (mas diferentes instâncias).
Então, ao invés de misturar "lookup estático" com pesquisas de banco de dados, é melhor apenas um uso deles.

No meu caso - pesquisas armazenadas no banco de dados. Mas, para evitar ida e volta ao banco de dados apenas por uma questão de obter o objeto que só é necessário para uso de carga, em vez de Get:

address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB

Outras dicas

Confira o que chamamos enumeração aulas ..

É basicamente o flyweight padrão.

Você pode persistir los, usando uma implementação IUserType, como o valor ou o nome de exibição.

Nós fazemos coisas loucas com eles. Como fornecer tabelas de pesquisa genned-auto com chaves estrangeiras para pessoas DBA, mantendo todos os valores no código.

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