Я использую Entity Framework 6.x, используя подход Code First в приложении MVC 5. В этой конкретной ситуации моя модель (среди прочего) содержит два свойства с именами Широта и Долгота:
[Required, Range(-90, +90)]
public decimal Latitude { get; set; }
[Required, Range(-180, +180)]
public decimal Longitude { get; set; }
И когда я выполнил миграцию, у меня получилось что-то вроде этого
CreateTable("ResProperty"), c => new {
:
Latitude = c.Decimal(nullable: false, precision: 10, scale: 8),
Longitude = c.Decimal(nullable: false, precision: 11, scale: 8),
:
})
... other stuff
поэтому широта и долгота состоят из 8 десятичных цифр. Первый - с 2 целыми числами (максимум 90), а второй - с 3 целыми числами (максимум 180).
После выполнения команды Update-Database столбцы моей таблицы отображаются как:
Latitude decimal(10,8)
Longitude decimal(11,8)
мне это кажется хорошим. Теперь, на мой взгляд, у меня есть карта и код Javascript, который позволяет пользователю перемещать маркер. Это тоже отлично работает. Когда маркер перемещается, поля Широта и Долгота заполняются обновленным значением, которое (Javascript) содержит более 12 десятичных цифр. Это не имеет значения, AFAIK, потому что мой масштаб - 8 десятичных знаков.
После нажатия кнопки отправки и вызова метода Create или Edit POST я проверяю экземпляр модели и подтверждаю, что фактические значения, переданные в модель контроллеру, верны, у них более чем достаточно десятичных цифр (тех, которые в коде Javascript место). Значит, значение правильное.
Теперь ... проблема в том, что после выполнения db.SaveChanges () база данных обновляется - и я подтвердил, что произошла фактическая запись / обновление, - но каким-то образом внутри EF игнорирует мои фактические значения и записывает усеченную широту / долготу округлено ТОЛЬКО до ДВУХ десятичных цифр, поэтому моя Широта отображается в БД как 09.500000000, все остальные десятичные цифры обнуляются, потому что, похоже, произошло округление.
// Prior to SaveChanges()
Latitude = 9.08521879
Longitude = -79.51658792
// After SaveChanges()
Latitude = 9.08000000
Longitude = -79.51000000
Почему округляется, если я указал правильный масштаб и точность, а столбец также имеет правильный масштаб и точность? почему SaveChanges изменяет мои значения?
Я нашел это сообщение (http://weiding331.blogspot.com/2014/01/entity-framework-decimal-value.html), что является той же проблемой, но я не знаю, как я могу это исправить (если это так), потому что я уже выполнил несколько миграций и добавлений данных после рассматриваемая таблица была "перенесена".
Подводя итоги
- Тип данных модели правильный (десятичный)
- Код миграции базы данных имеет правильную точность / масштаб (шир. 10/8, долгота 11/8).
- Столбцы базы данных SQL имеют правильную точность / масштаб (широта 10/8, длинная 11/8).
- Значения, переданные в модель, содержат не менее 8 десятичных цифр как для широты, так и для долготы.
- фактическая запись / обновление значения происходит в базе данных без ошибок, но ...
- Значения, записанные в базе данных для этих двух столбцов, усекаются до ДВУХ десятичных цифр, а остальные наименее значимые десятичные цифры отображаются как ноль (0).