Código da estrutura da entidade Truncando primeiro meus decimais
Estou usando o Entity Framework 6.x usando a abordagem Code First em um aplicativo MVC 5. Nessa situação específica, meu modelo (entre outras coisas) contém duas propriedades denominadas Latitude e Longitude:
[Required, Range(-90, +90)]
public decimal Latitude { get; set; }
[Required, Range(-180, +180)]
public decimal Longitude { get; set; }
E quando realizei a migração, obtive algo parecido com isto
CreateTable("ResProperty"), c => new {
:
Latitude = c.Decimal(nullable: false, precision: 10, scale: 8),
Longitude = c.Decimal(nullable: false, precision: 11, scale: 8),
:
})
... other stuff
então latitude e longitude têm 8decimal dígitos. O primeiro com 2 números inteiros (máximo de 90) e o segundo com 3 números inteiros (máximo de 180).
Depois de executar o comando Update-Database, as colunas da minha tabela são mostradas como:
Latitude decimal(10,8)
Longitude decimal(11,8)
isso me parece bom. Agora, na minha opinião, tenho um mapa e código Javascript que permite ao usuário reposicionar o marcador. Isso funciona bem também. Quando o marcador é reposicionado, os campos Latitude e Longitude são preenchidos com o valor atualizado que (Javascript) possui mais de 12 dígitos decimais. Isso não importa AFAIK, porque minha escala é de 8 casas decimais.
Depois que o botão enviar é pressionado e o método Criar ou Editar POST é chamado, examino a instância do modelo e confirmo que os valores reais passados no modelo para o controlador estão corretos, eles têm dígitos decimais mais do que suficientes (aqueles que o código Javascript Lugar, colocar). Portanto, o valor está correto.
Agora ... o problema é que, após a execução do db.SaveChanges (), o banco de dados é atualizado - e eu confirmei que uma gravação / atualização real ocorreu - mas, de alguma forma, internamente, o EF desconsidera meus valores reais e grava latitude / longitude truncada arredondado para APENAS DOIS dígitos decimais, portanto, minha Latitude mostra no DB como 09.500000000 todos os outros dígitos decimais são zerados porque parece ter ocorrido um arredondamento.
// Prior to SaveChanges()
Latitude = 9.08521879
Longitude = -79.51658792
// After SaveChanges()
Latitude = 9.08000000
Longitude = -79.51000000
Por que está arredondando se eu dei a escala e a precisão corretas e a coluna também tem a escala e a precisão corretas? por que o SaveChanges está alterando meus valores?
Encontrei este post (http://weiding331.blogspot.com/2014/01/entity-framework-decimal-value.html), que é o mesmo problema, mas não sei como corrigir isso (se houver), porque já realizei várias migrações e adições de dados depois que a tabela em questão foi "migrada".
Resumindo
O tipo de dados do modelo está correto (decimal)O código de migração do banco de dados possui a precião / escala correta (lat 10/8 lon 11/8)As colunas do banco de dados SQL têm a precisão / escala correta (lat 10/8, long 11/8)Os valores passados no modelo têm pelo menos 8 dígitos decimais para latitude e longitudea gravação / atualização real do valor ocorre no banco de dados sem erros, mas ...Os valores registrados no banco de dados para essas duas colunas são truncados para DOIS dígitos decimais e mostram os outros dígitos decimais menos significativos como zero (0)