NaVeN Kumar Ответов: 2

Decima (16, 5) округление столбца и сохранение хвостовых нулей даже при его наличии значения


Привет,

Я использую entityframework в своем проекте. У меня есть столбец под названием Factor в БД, и его тип данных decimal(16,5) nullable.

Я дал ввод, как 312.3132388888888888, и он сохраняет в БД, как 312.31000, не уверен в причине. Я отладил код и видел, как он получает полное значение, он не округляется в коде.

Похоже, что он обновляет 2 десятичных знака, но когда вручную обновляет значение в базе данных sql с помощью запроса обновления, оно обновляется правильно.

Может ли кто-нибудь сказать, что вызывает эту проблему, не упускаю ли я чего-нибудь?


Заранее спасибо!!!

Что я уже пробовал:

Я нашел следующее решение,но у меня есть более 20 десятичных столбцов. Есть ли какое-либо другое решение, где я могу применить все столбцы?

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Metrics>().Property(x => x.PPM).HasPrecision(4, 3);
    }

2 Ответов

Рейтинг:
1

Kornfeld Eliyahu Peter

Вероятно, это связано со значениями по умолчанию десятичной дроби в EF, которая равна (18,2)...
Если вы хотите что-то другое, вы должны объявить это, недостаточно того, что у вас есть это в БД...
Так что ваше решение-лучшее, что у вас может быть...


NaVeN Kumar

Привет Корнфельд, я проверил и нашел несколько статей, где они были созданы, как показано ниже.. Это правильный путь? вызовет ли это какие-либо проблемы с производительностью?

[Атрибут Attributeusage(Явное Управление Размещением.Свойство, AllowMultiple = false)]
точность публичного класса: атрибут
{
общественные байтовой точностью { получить; набор; }
масштаб публичных байт { получить; набор; }

публичная точность(байтовая точность, байтовая шкала)
{
this. precision = точность;
this. scale = масштаб;
}

public static void ConfigureModelBuilder (DbModelBuilder modelBuilder)
{
для построения модели.Собственности().Где (x => x.GetCustomAttributes(false).OfType (Точность).Любой()).Configure(c => c.HasPrecision(c.ClrPropertyInfo.GetCustomAttributes(false).OfType (Точность).Первый().точность, c.ClrPropertyInfo.GetCustomAttributes(ложь).OfType (Точность).Первый (). масштаб));
}
}

Затем в вашем OnModelCreating просто добавьте следующее:


Точность.ConfigureModelBuilder(в modelbuilder);

А в вашей модели просто добавьте атрибут Precision к любым десятичным свойствам.


[Точность(18, 9)]
публичная десятичная дробь? Широта { get; set; }

Kornfeld Eliyahu Peter

Это идеальное решение, но вам все равно придется добавить этот атрибут ко всем вашим десятичным значениям!

Рейтинг:
1

Dave Kreskowiak

Единственное решение-объявить это соответствующим образом для каждого столбца, который у вас есть.

Нет, нет никакого способа применить его в одном заявлении. Это не имеет никакого отношения к базе данных вообще, но все, что связано с вашей моделью EF.