HasPrecision – Definindo a precisão de campos decimais.

Uma tarefa comum, quando trabalhamos com sistemas financeiros (ou matemáticos), é a necessidade de lidar com a precisão de casas decimais de nossos campos numéricos. Muitas vezes, neste tipo de sistema, o uso de apenas duas casas decimais não é suficiente para armazenar toda a precisão numérica dos valores utilizados. E o Entity Framework fornece recursos para que trabalhemos com diferentes precisões numéricas em campos decimais.

numbers

Vamos começar falando sobre as convenções básicas para criação de campos decimais. Quando criamos um campo Decimal, sem informar sua precisão, o EF toma como padrão a precisão (18,2). Mas, podemos modificar esta precisão utilizando o extension method HasPrecision(byte, byte). Este método contém dois parâmetros:

Precision: precisão do campo (soma da quantidade de casas decimais com a quantidade de casas inteiras).
Scale: quantidade de casas decimais.

No exemplo, utilizaremos uma classe de estrutura bastante simples, própria apenas para demostrar o armazenamento de valores decimais. Sua estrutura pode ser vista logo abaixo:

mathresultEstruturaClasse

Como exemplo será armazenado o valor do PI em nosso banco de dados.

Capturar3

Quando mapeamos a tabela, sem adicionar nenhuma configuração adicional, a precisão criada para o campo é de (18,2) – como mencionado anteriormente.

mathresult01

 

E os registros na tabela são armazenados com apenas dois campos após a vírgula.

Capturar2

Quando utilizamos o extension method HasPrecision alteramos a precisão de nossos campos decimais, como no exemplo abaixo que configuramos uma precisão (7,6).

mathresult02

 

Esse tipo de configuração modifica a precisão do campo fisicamente na tabela.

mathresult03

Além de modificar o formato como os dados são armazenados no banco de dados. Abaixo um registro com seis casas decimais de precisão.

Capturar

Este tipo de configuração influência diretamente no modo como os valores são salvos, pois evita arredondamentos e armazena os valores sem perdas em sua precisão.

Um erro comum é configurar a precisão menor que a escala, o que gera uma exception do tipo MetadataException. Com a mensagem: “A combinação de Precision e Scale não é válida. Precision (X) deve ser maior ou igual a Scale (Y)”. A resolução deste problema é muito simples, basta configurar o parâmetro precision com um valor maior ou igual ao valor do parâmetro scale.

erro

Por
Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#

Anúncios

2 Responses to HasPrecision – Definindo a precisão de campos decimais.

  1. Muito boa sua dica. Eu aprendi outro jeito, com alguém que não lembro agora (vergonha da minha parte), a criar uma classe herdando de EntityTypeConfiguration, com um nome sugerido como MathResultConfig, com apenas o construtor como método, cuidando de fazer justamente o que vc demonstrou acima: “this.Property(m => m.Value).HasPrecision(7,6);”. Considerando que isso é “Fluent”, acho que bem pode ter sido vc quem deu essa dica pra comunidade. Em todo caso, um abraço e continue com as dicas, por favor. Saudações

    • Grande Antonio!
      Tudo beleza?

      Acho que esse lance do EntityTypeConfiguration foi algo que conversamos no Visual Summit 2012, não?

      Obrigado pelo comentário!
      []s!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: