

  * EntityFramework Version=6.0.0.0
  * .Net Framework targetFramework="4.6.1"
  * SQL Server Express 13.0.4001.0

SQL Server上のテーブルに、Decimal(12, 3)、Decimal(18,
3)で作成したカラムがあり、Linqを使ってそのカラムの更新を行っています。

[code]

    decimal? d12 = 123.456m;
    decimal? d18 = 222.222m;
    Record rec = DbContext.Table.Where(a => a.id == 1).First();
    rec.dec12_3col = d12;
    rec.dec18_3col = d18;
    DbContext.SaveChanges();
    
[/code]

そして更新後にSQL Server Management Studioでデータを確認すると、dec12_3colには 123.450、
dec18_3colには 222.220 が入っており、小数3桁めが切り捨てられてしまっています。

SaveChangesを呼び出す前のところでデバッガでrecを見てもそれぞれ小数3桁まで値がセットされているのを確認できるので、どこを直したらいいものなのか分からず困っています。

よろしくお願いします。


CC BY-SA 4.0
2019-08-16T02:10:17.410
57394
2019-08-16T06:47:27.617
2019-08-16T04:24:55.887
25004
25004
question
c# sql-server linq entity-framework
Decimal値をSQLServerに保存すると小数2桁までしか保存されない


原因は何も配置しないとSQLのDecimalディフォルト精度(18,2)として使っていると思う。

プログラムの構成はわかりませんので、大体配置ファイルに下記のコード追加して改善かも。

[code]

    <Property Name="dec12_3col" Type="decimal" Precision="12" Scale="3" Nullable="false" />
    <Property Name="dec18_3col" Type="decimal" Precision="18" Scale="3" Nullable="false" />
    
[/code]


CC BY-SA 4.0
2019-08-16T02:30:26.773
57395
2019-08-16T04:29:37.960
2019-08-16T04:29:37.960
3060
35385
57394
answer


DbContextに精度を記載することで解決できました。

[code]

    public partial class ProjectDbContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
                modelBuilder.Entity<Table>()
                    .Property(e => e.dec12_3col)
                    .HasPrecision(12, 3);
    
                modelBuilder.Entity<Table>()
                    .Property(e => e.dec18_3col)
                    .HasPrecision(18, 3);
        }
    }
    
[/code]

この修正で小数3桁めも正常にセットされるようになりました。


CC BY-SA 4.0
2019-08-16T06:47:27.617
57402
2019-08-16T06:47:27.617
25004
57394
answer