Pergunta

Eu tenho um objeto de dados (digamos que ele é chamado de 'entrada'), que tem um conjunto de estados potenciais que algo parecido com isto:

1 - Created
2 - File added
3 - Approved
4 - Invalid

Este é representada no banco de dados com uma tabela 'Status' com uma chave primária autonumber, em seguida, um campo 'StatusId' na tabela principal, com as relações adequadas definidas.

Na minha camada (personalizado) de dados, eu tenho objeto a 'entrada', e, atualmente, eu também declarar um Enum com os estados listados acima especificado. Finalmente eu declarar uma instância privada deste Enum junto com a propriedade pública apropriada.

No meu método 'Commit ()' Eu lancei a instância do Enum para um inteiro e passá-lo para um procedimento de actualização armazenado.

Na minha estática 'GetEntry ()' método que eu, obviamente, terá um inteiro passou para trás do banco de dados. Em seguida, utilizar o 'Enum.Parse) (' método para extrair um objecto que é um exemplo de meu enum que corresponde ao número inteiro estado devolvido. Eu lancei isso para o tipo do meu Enum e atribuí-lo à variável privada local.

A minha pergunta é muito simples -. É esta abordagem adequada, e se não o que alternativa, que não seja apenas armazenar o valor inteiro cru (que eu não sou necessariamente avessos a), é melhor

A minha razão para pedir é que tudo isso só parece incrivelmente confuso para mim, que com toda a fundição e manter duas listas do mesmo conjunto de valores. Eu aceito as mentiras de benefícios em uma melhor experiência para o consumidor do objeto de dados, mas mesmo assim ...

Obrigado!

Foi útil?

Solução

Temos algo familiar em um de nossos projetos. Temos uma mesa de containting tipos de itens. Estes tipos têm um id, no código temos uma enumeração com o mesmo id do. A coisa é, no banco de dados não usamos autonumber (identidade) por isso temos o controle total da id. E quando salvar nosso objeto só levamos o id do enum para salvar o objeto. Eu também pensei que esta abordagem foi confuso, mas não é tão ruim afinal.

Outras dicas

Esse método parece-me muito bem.

No passado eu fiz a mesma coisa, mas também tinha uma mesa que continha uma linha para cada membro da enumeração que a tabela era então a chave estrangeira para qualquer tabela que usou o valor de enumeração, só assim alguém ler o banco de dados poderia entender o que cada estado era sem ter que ver a enumeração real.

Por exemplo, se eu tivesse um enum como

enum status
{
    Active,
    Deleted,
    Inactive
}

Eu tenho uma tabela chamada de status que teria os seguintes registros

ID Nome
0 ativos
1 Deleted
2 Inativo

Essa mesa, então, seria a chave estrangeira para todas as tabelas que usaram que enum.

Sim isso é bom!

Por favor, sempre definir explicitamente os valores como este. Dessa forma, se alguém nunca vai acrescentar algo eles vão perceber os valores são importantes e não devem ser sujada com.

enum status
{
    Active = 1,
    Deleted = 2,
    Inactive = 3
}

Se você está passando o valor em torno via WCF eu recomendo adicionando

  NULL = 0

Caso contrário, se você tentar serializar um 0 vindo do banco de dados você vai ter um erro horrível e ele vai levá-lo para sempre a depuração.

a tabela de referência de banco de dados é necessária; enum programático é conveniente para evitar ter 'números mágicos' no código

Se o seu código não precisa de manipular o status, no entanto, em seguida, a enumeração é desnecessária

Eu faço essa abordagem com Enums o tempo todo. Se ele é um item simples como status que não é esperado que a mudança nunca eu prefiro o Enum. A análise e fundição é uma operação muito baixo impacto.

Eu tenho feito isso com sucesso com Linq para Sql já há algum tempo, sem problemas. Linq vai realmente converter de Enum para int e volta automaticamente.

Código é mais do que apenas sobre a velocidade, mas a legibilidade. Enums tornar legível código.

Para responder a sua pergunta directamente este é um apporach muito válido.

Se o seu código requer definição de valores conhecidos "Estado" (que você definiu em sua enumeração), então provavelmente é também uma exigência que existem esses valores "Estado" no banco de dados. Uma vez que deve existir você também deve ter controle sobre o Status_ID atribuído a cada um desses valores.

Queda da identidade e apenas definir explicitamente as IDs valor de pesquisa.

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