Използвам Entity Framework 6.x, като използвам подхода Code First на приложение MVC 5. В тази конкретна ситуация моят модел (наред с други неща) съдържа две свойства, наречени Latitude и Longitude:
[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 знака след десетичната запетая.
След като се натисне бутонът за изпращане и се извика методът Създаване или Редактиране на POST, разглеждам екземпляра на модела и потвърдих, че действителните стойности, предадени в модела към контролера, са правилни, те имат повече от достатъчно десетични цифри (тези, които Javascript код място). Значи стойността е правилна.
Сега... проблемът е, че след изпълнението на db.SaveChanges() базата данни се актуализира - и аз потвърдих, че е извършено действително запис/актуализация - но по някакъв начин вътрешно EF пренебрегва действителните ми стойности и записва съкратена ширина/дължина закръглена САМО до ДВЕ десетични цифри, така че моят Latitude се показва в DB като 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)