Pomelo.EntityFrameworkCore.MySql icon indicating copy to clipboard operation
Pomelo.EntityFrameworkCore.MySql copied to clipboard

When Pomelo creates 'dotnet ef migrations script', 'decimal type' is output as 'money type'.

Open bluekms opened this issue 3 years ago • 2 comments

Steps to reproduce

Tutorial: Create a complex data model - ASP.NET MVC with EF Core I am learning the official tutorial.

The issue

class Department
{
    [DataType(DataType.Currency)]
    [Column(TypeName = "money")]
    public decimal Budget { get; set; }
}

original source code

class Department
{
    [DataType(DataType.Currency)]
    public decimal Budget { get; set; }
}

my source code 1

class Department
{
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal")]
    public decimal Budget { get; set; }
}

my source code 2

original source code, my1, my2 They all produce the same code.

`Budget` money(65,30) NOT NULL
Exception message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'money(65,30) NOT NULL,
Stack trace: money(65,30) NOT NULL,
        `StartDate` datetime(6) NOT NULL,
        `Inst' at line 8

Further technical details

MySQL version: 8.0.28 Operating system: windows 10 Pomelo.EntityFrameworkCore.MySql version: 6.0.1 Pomelo.EntityFrameworkCore.MySql.Design : 1.1.2 Microsoft.EntityFrameworkCore : 6.0.6 Microsoft.EntityFrameworkCore.Design : 6.0.1

bluekms avatar Jul 12 '22 06:07 bluekms

Maybe it's a snapshot issue. Is there any way to fix that?

bluekms avatar Jul 12 '22 07:07 bluekms

@bluekms the official Microsoft tutorial uses SQL Server LocalDB engine which supports 'money' type (which looks like alias for decimal type). There is no money type in MySQL and MariaDB and that's why there is no such support in Pomelo. Maybe it will be good for Pomelo to detect DataType(DataType.Currency)] attribute and automatically convert such types to decimal.

To make it work for you:

  1. Remove [DataType(DataType.Currency)]
  2. Remove [Column(TypeName = "money")] or replace it with [Column(TypeName = "decimal(18,2)")]. Check the official MySQL guide for decimal precision and scale (18 and 2 in my case) https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html

KirillKaverin avatar Jul 12 '22 08:07 KirillKaverin