pesquisas estáticos em NHibernate
-
06-07-2019 - |
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.
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.