Evite strings e constantes mágicas a todo custo. Elas estão completamente fora de questão, não devem ser consideradas como opções. Isso parece deixá-lo com apenas uma opção viável: identificadores, isto é, enums. No entanto, há também mais uma opção, que na minha opinião é a melhor. Vamos chamar essa opção de "Objetos pré-carregados". Com objetos pré-carregados, você pode fazer o seguinte:
if( user.FavouriteFruit.ID == MyApplication.Grape.ID )
O que aconteceu aqui é que eu obviamente carreguei toda a linha de Grape
na memória, então tenho seu ID pronto para uso em comparações. Se você estiver usando o Mapeamento Objeto-Relacional (ORM), ele ficará ainda melhor:
if( user.FavouriteFruit == MyApplication.Grape )
(É por isso que eu chamo de "Objetos pré-carregados".)
Então, o que eu faço é que durante a inicialização eu carrego todas as minhas tabelas de "enumeração" (pequenas tabelas como dias da semana, meses do ano, sexos, etc.) na classe de domínio principal do aplicativo. Eu os carrego pelo nome, porque obviamente, MyApplication.Grape
deve receber a linha chamada "Grape", e afirmo que todos e cada um deles são encontrados. Caso contrário, temos um erro de tempo de execução garantido durante a inicialização, que é o menos maligno de todos os erros de tempo de execução.