์คํฌ๋ฆฝํธ ๋ง์ด๊ทธ๋ ์ด์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
Entity Framework Core 3.0.0์ ์ต์ ์ด ์๋ 'Pomelo.EntityFrameworkCore.MySql' ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ์ฌ 'ApplicationDbContext'๋ฅผ ์ด๊ธฐํํ์ต๋๋ค. MaxPoolSize=128 ServerVersion 5.7.22 MySql
ASP.NET Core ID์ฉ์ผ๋ก ์์ฑ๋ SQL ์คํฌ๋ฆฝํธ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ๋ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์คํฌ๋ฆฝํธ(์ฒซ ๋ฒ์งธ CREATE TABLE๋ง)๋ฅผ ์คํํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
nvarchar ๋ฐ nvarchar(max)๊ฐ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํ
์ด๋ธ ์์ฑ AspNetRoles
(
Id
nvarchar(450) NULL์ด ์๋๋๋ค.
Name
nvarchar(256) NULL,
NormalizedName
nvarchar(256) NULL,
ConcurrencyStamp
nvarchar(์ต๋) NULL,
์ ์ฝ ์กฐ๊ฑด PK_AspNetRoles
๊ธฐ๋ณธ ํค( Id
)
);
๋ถ์ ์ค์ 4๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ธ์ํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์
๋๋ค. (์์น 39์ "nvarchar" ๊ทผ์ฒ)
์ธ์ํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์
๋๋ค. (์์น 75์ "nvarchar" ๊ทผ์ฒ)
์ธ์ํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์
๋๋ค. (์์น 117์ "nvarchar" ๊ทผ์ฒ)
์ธ์ํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์
๋๋ค. (์์น 161์ "nvarchar" ๊ทผ์ฒ)
SQL ์ฟผ๋ฆฌ:
ํ
์ด๋ธ ์์ฑ AspNetRoles
( Id
nvarchar(450) NOT NULL, Name
nvarchar(256) NULL, NormalizedName
nvarchar(256) NULL, ConcurrencyStamp
nvarchar(max) NULL, ์ ์ฝ ์กฐ๊ฑด PK_AspNetRoles
๊ธฐ๋ณธ ํค( Id
) )
MySQL์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค. ๋ฌธ์
CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
)' 5ํ
MySQL ๋ฒ์ : 5.7.22
์ด์ ์ฒด์ : ์๋์ฐ 10
Pomelo.EntityFrameworkCore.MySql ๋ฒ์ : 3.0.0-rc1.final
Microsoft.AspNetCore.App ๋ฒ์ : 3.0
#863์ ์ฌํํ๋ ค๊ณ ์๋ํ๋ ๋์ ํ๋ ์๋์์ ๋์ผํ ๋ง์ด๊ทธ๋ ์ด์
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ dotnet ef update database
๋ช
๋ น์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ง๊ธ ํ์ธ ์ค์
๋๋ค.
์ ASP.NET Core ํ๋ก์ ํธ(์ธ์ฆ ์ต์
์ฌ์ฉ)๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ EF Core ๊ณต๊ธ์๋ฅผ Pomelo.EntityFrameworkCore.MySql
๋ก ๋ณ๊ฒฝํ ๋ค์ ๋ง์ด๊ทธ๋ ์ด์
๋๋ ์
๋ฐ์ดํธ ๋ช
๋ น์ ์คํํ๋ฉด ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ VS๊ฐ SQL Server๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ์ฃผ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ์ด๋ฏธ .\Data\Migrations\00000000000000_CreateIdentitySchema.cs
ํ์ผ์ ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์
CreateIdentitySchema
์ ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค( Up
๋ฐ Down
์์
) ๋ฐ .\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข
์์ฑ์ด ๋์ ๋์ ๋ชจ๋ธ ํฌํจ)๋ SQL Server ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.
SQL Server๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ ์ค์ ๋ก ์ฒ๋ฆฌํด์ผ ํ ๋จ๊ณ๊ฐ ์ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ชป๋ ๋ง์ด๊ทธ๋ ์ด์ ์ด ํฌํจ๋ฉ๋๋ค.
SQL Server๊ฐ ์๋ MySQL๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋จผ์ ConfigureServices
๋ฉ์๋์์ UseMySql()
๊ฐ ํธ์ถ๋๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค.
```c#
options.UseMySql(
Configuration.GetConnectionString("๊ธฐ๋ณธ ์ฐ๊ฒฐ"));
Then delete the entire `Migrations` folder and just run something similar to the following command, to recreate the initial migration compatible with MySQL:
dotnet ef ๋ง์ด๊ทธ๋ ์ด์ ์ CreateIdentitySchema๋ฅผ ์ถ๊ฐํฉ๋๋ค.
After that, the newly created initial migration will be compatible with MySQL and other operations based on that migration will be as well.
For example, the `CREATE TABLE` script for `AspNetRoles` when creating a migration script (by using `dotnet ef migrations script`) will look like this:
```sql
CREATE TABLE `AspNetRoles` (
`Id` varchar(255) NOT NULL,
`Name` varchar(256) NULL,
`NormalizedName` varchar(256) NULL,
`ConcurrencyStamp` longtext NULL,
CONSTRAINT `PK_AspNetRoles` PRIMARY KEY (`Id`)
);
์ ASP.NET Core ํ๋ก์ ํธ(์ธ์ฆ ์ต์ ์ฌ์ฉ)๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ EF Core ๊ณต๊ธ์๋ฅผ
Pomelo.EntityFrameworkCore.MySql
๋ก ๋ณ๊ฒฝํ ๋ค์ ๋ง์ด๊ทธ๋ ์ด์ ๋๋ ์ ๋ฐ์ดํธ ๋ช ๋ น์ ์คํํ๋ฉด ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.๋ฌธ์ ๋ VS๊ฐ SQL Server๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ์ฃผ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ์ด๋ฏธ
.\Data\Migrations\00000000000000_CreateIdentitySchema.cs
ํ์ผ์ ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ CreateIdentitySchema
์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค(Up
๋ฐDown
์์ ) ๋ฐ.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ์์ฑ์ด ๋์ ๋์ ๋ชจ๋ธ ํฌํจ)๋ SQL Server ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.
Pomelo.EntityFrameworkCore.MySql ๋ฒ์ 2.2์์๋ CreateIdentitySchema๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ์์ฑํ์ง ์๊ณ ์๋ํฉ๋๋ค.
์์ฑ๋ ํ ์ด๋ธ ์์ฑ ์คํฌ๋ฆฝํธ
CREATE TABLE `aspnetroles` (
`Id` varchar(255) NOT NULL,
`Name` varchar(256) DEFAULT NULL,
`NormalizedName` varchar(256) DEFAULT NULL,
`ConcurrencyStamp` longtext,
PRIMARY KEY (`Id`),
UNIQUE KEY `RoleNameIndex` (`NormalizedName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
์ค๋ฅ ์์ด,
3.0 ์ด์์ด ํธํ์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ํด ๋์ผํ๊ฒ ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ๋ณ๊ฒฝ์ ๋ํ ์ด์ ๊ฐ ์์ต๋๊น?
๊ฐ์ฌ ํด์,
Pomelo.EntityFrameworkCore.MySql ๋ฒ์ 2.2์์๋ CreateIdentitySchema๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ์์ฑํ์ง ์๊ณ ์๋ํฉ๋๋ค.
๋ณ๊ฒฝ ์์ด Pomelo 2.2์์ ํจ๊ณผ๊ฐ ์์๋ค๋ฉด ํ๋ฅญํ์ง๋ง ๊ตฌ์ฑ(๋ฐ ํค ์ ํ)์ ํฌ๊ฒ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐํํ ์ ์์ต๋๋ค.
์์์ ์ค๋ช ํ ๋๋ก ์ ํจํ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ๋ชจ๋ธ ์ ์๋ฅผ ์ป์ ์ ์๋๋ก ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ์ค์ค๋ก ์์ ํด์ผ ํ๋ฉฐ ์์ฑ๋ ์ฝ๋๋ฅผ ์ฝ๊ฐ ์์ ํ์ฌ ์๋ํ๋๋ก ํด์ผ ํ ์๋ ์์ต๋๋ค(MySQL ์ง์์ ๋ฐ๋ผ ๋๋ฌด ๋ง์ ๋ ธ๋ ฅ ์์ด ์ํํ ์ ์์).
3.0 ๋ฆด๋ฆฌ์ค์๋ ๋ช ๊ฐ์ง ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฏ๋ก(์ ์ ํ๊ฒ ํ๊ทธ๊ฐ ์ง์ ๋์ด์ผ ํจ) ์ฃผ์ ๋๋ ๋ถ ์ ๊ทธ๋ ์ด๋์ ๊ฒฝ์ฐ ํ๋ก๋์ ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ ๋จผ์ ๊ฐ๋ฐ ๋ฐ ์คํ ์ด์ง ํ๊ฒฝ์์ ์ฝ๋๋ฅผ ํ ์คํธํ์ญ์์ค.
์ค๋ฅ ์์ด,
[...]
์ด ๋ณ๊ฒฝ์ ๋ํ ์ด์ ๊ฐ ์์ต๋๊น?
3.0์ ์ด๋ค ์ค๋ฅ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํ์๋ ๊ฑด๊ฐ์?
2.2.6์์ 3.0.0์ผ๋ก ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๋ ๋ชจ๋ธ ํด๋์ค, ํด๋น ์ ์, ์์ฑ๋ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ๊ฒฐ๊ณผ SQL ์คํฌ๋ฆฝํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ฒ์ํ์ฌ ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ASP.NET Core ํ๋ก์ ํธ(์ธ์ฆ ์ต์ ์ฌ์ฉ)๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ EF Core ๊ณต๊ธ์๋ฅผ
Pomelo.EntityFrameworkCore.MySql
๋ก ๋ณ๊ฒฝํ ๋ค์ ๋ง์ด๊ทธ๋ ์ด์ ๋๋ ์ ๋ฐ์ดํธ ๋ช ๋ น์ ์คํํ๋ฉด ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.๋ฌธ์ ๋ VS๊ฐ SQL Server๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ์ฃผ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ์ด๋ฏธ
.\Data\Migrations\00000000000000_CreateIdentitySchema.cs
ํ์ผ์ ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ CreateIdentitySchema
์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค(Up
๋ฐDown
์์ ) ๋ฐ.\Data\Migrations\00000000000000_CreateIdentitySchema.Designer.cs
(๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ์์ฑ์ด ๋์ ๋์ ๋ชจ๋ธ ํฌํจ)๋ SQL Server ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.SQL Server๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ ์ค์ ๋ก ์ฒ๋ฆฌํด์ผ ํ ๋จ๊ณ๊ฐ ์ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ชป๋ ๋ง์ด๊ทธ๋ ์ด์ ์ด ํฌํจ๋ฉ๋๋ค.
SQL Server๊ฐ ์๋ MySQL๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋จผ์
ConfigureServices
๋ฉ์๋์์UseMySql()
๊ฐ ํธ์ถ๋๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.```c#
options.UseMySql(
Configuration.GetConnectionString("๊ธฐ๋ณธ ์ฐ๊ฒฐ"));
dotnet ef ๋ง์ด๊ทธ๋ ์ด์ ์ CreateIdentitySchema๋ฅผ ์ถ๊ฐํฉ๋๋ค.