20260122085018_Init.cs 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  1. using System;
  2. using Microsoft.EntityFrameworkCore.Migrations;
  3. #nullable disable
  4. namespace Infrastructure.Persistence.Migrations
  5. {
  6. /// <inheritdoc />
  7. public partial class Init : Migration
  8. {
  9. /// <inheritdoc />
  10. protected override void Up(MigrationBuilder migrationBuilder)
  11. {
  12. migrationBuilder.CreateTable(
  13. name: "BannerPosition",
  14. columns: table => new
  15. {
  16. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  17. .Annotation("SqlServer:Identity", "1, 1"),
  18. Code = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false, comment: "위치 구분"),
  19. Subject = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "위치 명"),
  20. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  21. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  22. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  23. },
  24. constraints: table =>
  25. {
  26. table.PrimaryKey("PK_BannerPosition", x => x.ID);
  27. },
  28. comment: "배너 위치");
  29. migrationBuilder.CreateTable(
  30. name: "Config",
  31. columns: table => new
  32. {
  33. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  34. .Annotation("SqlServer:Identity", "1, 1"),
  35. LastUpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "마지막 수정일시"),
  36. RowVersion = table.Column<byte[]>(type: "rowversion", rowVersion: true, nullable: false, comment: "동시성 제어용"),
  37. Basic_SiteName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "사이트 이름"),
  38. Basic_RootID = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "최고 관리자 ID"),
  39. Basic_FromEmail = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "송수신 이메일"),
  40. Basic_FromName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "송수신자 이름"),
  41. Basic_SmtpServer = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "SMTP Server"),
  42. Basic_SmtpPort = table.Column<int>(type: "int", nullable: true, comment: "SMTP Port"),
  43. Basic_SmtpEnableSsl = table.Column<bool>(type: "bit", nullable: true, comment: "SMTP Enable SSL"),
  44. Basic_SmtpUsername = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "SMTP Username"),
  45. Basic_SmtpPasswordEnc = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "SMTP Password (암호화 저장 권장)"),
  46. Basic_AdminWhiteIpList = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "관리자단 접근 가능 IP"),
  47. Basic_FrontWhiteIpList = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "사용자단 접근 가능 IP"),
  48. Basic_BlockAlertTitle = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "차단 시 안내문 제목"),
  49. Basic_BlockAlertContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "차단 시 안내문 내용"),
  50. Basic_IsMaintenance = table.Column<bool>(type: "bit", nullable: false, comment: "점검 여부"),
  51. Basic_MaintenanceContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "점검 내용"),
  52. Basic_DefaultPaymentGateway = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "기본 PG"),
  53. Basic_DefaultFeeAmount = table.Column<decimal>(type: "decimal(18,0)", precision: 18, scale: 0, nullable: true, comment: "기본 수수료(원)"),
  54. Basic_DefaultFeeRate = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: true, comment: "기본 수수료(%)"),
  55. Meta_Keywords = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Keywords"),
  56. Meta_Description = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Description"),
  57. Meta_Author = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Author"),
  58. Meta_Viewport = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Viewport"),
  59. Meta_ApplicationName = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Application Name"),
  60. Meta_Generator = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Generator"),
  61. Meta_Robots = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Meta Robots"),
  62. Meta_Adds = table.Column<string>(type: "nvarchar(max)", nullable: true),
  63. Company_Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
  64. Company_RegNo = table.Column<string>(type: "nvarchar(max)", nullable: true),
  65. Company_Owner = table.Column<string>(type: "nvarchar(max)", nullable: true),
  66. Company_Tel = table.Column<string>(type: "nvarchar(max)", nullable: true),
  67. Company_Fax = table.Column<string>(type: "nvarchar(max)", nullable: true),
  68. Company_RetailSaleNo = table.Column<string>(type: "nvarchar(max)", nullable: true),
  69. Company_AddedSaleNo = table.Column<string>(type: "nvarchar(max)", nullable: true),
  70. Company_ZipCode = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "사업장 주소(우편번호)"),
  71. Company_Hosting = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "호스팅 서비스"),
  72. Company_AdminName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "정보관리책임자"),
  73. Company_AdminEmail = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: true, comment: "정보관리책임자 E-mail"),
  74. Company_SiteUrl = table.Column<string>(type: "nvarchar(300)", maxLength: 300, nullable: true, comment: "사이트 주소"),
  75. Company_BankCode = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "입금 계좌(은행 코드)"),
  76. Company_BankOwner = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "예금주"),
  77. Company_BankNumber = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "계좌번호"),
  78. Account_IsRegisterBlock = table.Column<bool>(type: "bit", nullable: false, comment: "회원가입 차단"),
  79. Account_IsRegisterEmailAuth = table.Column<bool>(type: "bit", nullable: false, comment: "회원가입 시 이메일 인증"),
  80. Account_PasswordMinLength = table.Column<int>(type: "int", nullable: true, comment: "비밀번호 최소 길이"),
  81. Account_PasswordUppercaseLength = table.Column<int>(type: "int", nullable: true, comment: "비밀번호 최소 대문자 수"),
  82. Account_PasswordNumbersLength = table.Column<int>(type: "int", nullable: true, comment: "비밀번호 최소 숫자 수"),
  83. Account_PasswordSpecialcharsLength = table.Column<int>(type: "int", nullable: true, comment: "비밀번호 최소 특수문자 수"),
  84. Account_DeniedEmailList = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "금지 이메일"),
  85. Account_DeniedNameList = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "금지 별명"),
  86. Account_ChangeEmailDay = table.Column<int>(type: "int", nullable: true, comment: "이메일 갱신 주기(일)"),
  87. Account_ChangeNameDay = table.Column<int>(type: "int", nullable: true, comment: "별명 갱신 주기(일)"),
  88. Account_ChangeSummaryDay = table.Column<int>(type: "int", nullable: true, comment: "한마디 갱신 주기(일)"),
  89. Account_ChangeIntroDay = table.Column<int>(type: "int", nullable: true, comment: "자기소개 갱신 주기(일)"),
  90. Account_ChangePasswordDay = table.Column<int>(type: "int", nullable: true, comment: "비밀번호 갱신 주기(일)"),
  91. Account_MaxLoginTryCount = table.Column<int>(type: "int", nullable: true, comment: "로그인 시도 제한 횟수"),
  92. Account_MaxLoginTryLimitSecond = table.Column<int>(type: "int", nullable: true, comment: "로그인 시도 제한 시간(초)"),
  93. EmailTemplate_RegisterEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원가입 시 - 제목"),
  94. EmailTemplate_RegisterEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원가입 시 - 내용"),
  95. EmailTemplate_RegistrationEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원가입 완료 - 제목"),
  96. EmailTemplate_RegistrationEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원가입 완료 - 내용"),
  97. EmailTemplate_ResetPasswordEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "비밀번호 재설정 - 제목"),
  98. EmailTemplate_ResetPasswordEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "비밀번호 재설정 - 내용"),
  99. EmailTemplate_ChangedPasswordEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "비밀번호 변경 완료 - 제목"),
  100. EmailTemplate_ChangedPasswordEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "비밀번호 변경 완료 - 내용"),
  101. EmailTemplate_WithdrawEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원탈퇴 시 - 제목"),
  102. EmailTemplate_WithdrawEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "회원탈퇴 시 - 내용"),
  103. EmailTemplate_EmailVerifyFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이메일 변경 시 - 제목"),
  104. EmailTemplate_EmailVerifyFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이메일 변경 시 - 내용"),
  105. EmailTemplate_ChangedEmailFormTitle = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이메일 변경 완료 - 제목"),
  106. EmailTemplate_ChangedEmailFormContent = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이메일 변경 완료 - 내용"),
  107. External_YouTubeApiKeyEnc = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "YouTube API Key (암호화 저장 권장)"),
  108. External_YouTubeApiName = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "YouTube API Name"),
  109. External_GoogleClientId = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Google Client ID"),
  110. External_GoogleClientSecretEnc = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Google Client Secret (암호화 저장 권장)"),
  111. External_GoogleAppId = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "Google APP ID")
  112. },
  113. constraints: table =>
  114. {
  115. table.PrimaryKey("PK_Config", x => x.ID);
  116. },
  117. comment: "운영 정보 설정 값");
  118. migrationBuilder.CreateTable(
  119. name: "Document",
  120. columns: table => new
  121. {
  122. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  123. .Annotation("SqlServer:Identity", "1, 1"),
  124. Code = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false, comment: "주소"),
  125. Subject = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false, comment: "제목"),
  126. Content = table.Column<string>(type: "nvarchar(max)", maxLength: 5000, nullable: true, comment: "내용"),
  127. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  128. Views = table.Column<int>(type: "int", nullable: false, comment: "조회 수"),
  129. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  130. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  131. },
  132. constraints: table =>
  133. {
  134. table.PrimaryKey("PK_Document", x => x.ID);
  135. },
  136. comment: "문서");
  137. migrationBuilder.CreateTable(
  138. name: "EmailVerifyNumber",
  139. columns: table => new
  140. {
  141. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  142. .Annotation("SqlServer:Identity", "1, 1"),
  143. Type = table.Column<int>(type: "int", nullable: false, comment: "인증 유형 (이메일 인증 / 비밀번호 재설정)"),
  144. Email = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false, comment: "이메일"),
  145. Code = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false, comment: "Code"),
  146. IsVerified = table.Column<bool>(type: "bit", nullable: false, comment: "인증 여부"),
  147. Expiration = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "만료 일시"),
  148. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  149. },
  150. constraints: table =>
  151. {
  152. table.PrimaryKey("PK_EmailVerifyNumber", x => x.ID);
  153. },
  154. comment: "이메일 인증 번호들");
  155. migrationBuilder.CreateTable(
  156. name: "EmailVerifyToken",
  157. columns: table => new
  158. {
  159. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  160. .Annotation("SqlServer:Identity", "1, 1"),
  161. Type = table.Column<int>(type: "int", nullable: false, comment: "인증 유형 (이메일 인증 / 비밀번호 재설정)"),
  162. Email = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false, comment: "이메일"),
  163. Token = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: false, comment: "Token"),
  164. IsVerified = table.Column<bool>(type: "bit", nullable: false, comment: "인증 여부"),
  165. Expiration = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "만료 일시"),
  166. Additional = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "추가 정보(JSON)"),
  167. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  168. },
  169. constraints: table =>
  170. {
  171. table.PrimaryKey("PK_EmailVerifyToken", x => x.ID);
  172. },
  173. comment: "이메일 인증 토큰들");
  174. migrationBuilder.CreateTable(
  175. name: "FaqCategory",
  176. columns: table => new
  177. {
  178. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  179. .Annotation("SqlServer:Identity", "1, 1"),
  180. Code = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: false, comment: "주소"),
  181. Subject = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "분류 명"),
  182. Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
  183. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  184. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  185. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  186. },
  187. constraints: table =>
  188. {
  189. table.PrimaryKey("PK_FaqCategory", x => x.ID);
  190. },
  191. comment: "FAQ 분류");
  192. migrationBuilder.CreateTable(
  193. name: "MemberGrade",
  194. columns: table => new
  195. {
  196. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  197. .Annotation("SqlServer:Identity", "1, 1"),
  198. KorName = table.Column<string>(type: "nvarchar(240)", maxLength: 240, nullable: false, comment: "한글 명"),
  199. EngName = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false, comment: "영문 명"),
  200. Description = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true, comment: "설명"),
  201. Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
  202. Image = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true, comment: "이미지"),
  203. RequiredExp = table.Column<int>(type: "int", nullable: false, comment: "누적 경험치"),
  204. RequiredAttendance = table.Column<long>(type: "bigint", nullable: false, comment: "누적 출석 수"),
  205. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  206. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  207. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  208. },
  209. constraints: table =>
  210. {
  211. table.PrimaryKey("PK_MemberGrade", x => x.ID);
  212. },
  213. comment: "회원 등급");
  214. migrationBuilder.CreateTable(
  215. name: "Popup",
  216. columns: table => new
  217. {
  218. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  219. .Annotation("SqlServer:Identity", "1, 1"),
  220. Subject = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "제목"),
  221. Content = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: true, comment: "내용"),
  222. Link = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "주소"),
  223. StartAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "사용 기간 - 시작"),
  224. EndAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "사용 기간 - 종료"),
  225. Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
  226. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  227. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  228. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  229. },
  230. constraints: table =>
  231. {
  232. table.PrimaryKey("PK_Popup", x => x.ID);
  233. },
  234. comment: "팝업");
  235. migrationBuilder.CreateTable(
  236. name: "BannerItem",
  237. columns: table => new
  238. {
  239. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  240. .Annotation("SqlServer:Identity", "1, 1"),
  241. PositionID = table.Column<int>(type: "int", nullable: false, comment: "배너 위치 ID"),
  242. Subject = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "배너 명"),
  243. DesktopImage = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: true, comment: "이미지(Desktop)"),
  244. MobileImage = table.Column<string>(type: "nvarchar(1024)", maxLength: 1024, nullable: true, comment: "이미지(Mobile)"),
  245. Link = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "주소"),
  246. Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
  247. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  248. StartAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "사용 기간 - 시작"),
  249. EndAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "사용 기간 - 종료"),
  250. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  251. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  252. },
  253. constraints: table =>
  254. {
  255. table.PrimaryKey("PK_BannerItem", x => x.ID);
  256. table.ForeignKey(
  257. name: "FK_BannerItem_BannerPosition_PositionID",
  258. column: x => x.PositionID,
  259. principalTable: "BannerPosition",
  260. principalColumn: "ID",
  261. onDelete: ReferentialAction.Cascade);
  262. },
  263. comment: "배너 아이템");
  264. migrationBuilder.CreateTable(
  265. name: "FaqItem",
  266. columns: table => new
  267. {
  268. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  269. .Annotation("SqlServer:Identity", "1, 1"),
  270. CategoryID = table.Column<int>(type: "int", nullable: false, comment: "분류 ID"),
  271. Question = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "질문"),
  272. Answer = table.Column<string>(type: "nvarchar(4000)", maxLength: 4000, nullable: true, comment: "답변"),
  273. Order = table.Column<short>(type: "smallint", nullable: false, comment: "순서"),
  274. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "사용 여부"),
  275. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  276. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  277. },
  278. constraints: table =>
  279. {
  280. table.PrimaryKey("PK_FaqItem", x => x.ID);
  281. table.ForeignKey(
  282. name: "FK_FaqItem_FaqCategory_CategoryID",
  283. column: x => x.CategoryID,
  284. principalTable: "FaqCategory",
  285. principalColumn: "ID",
  286. onDelete: ReferentialAction.Cascade);
  287. },
  288. comment: "FAQ 목록");
  289. migrationBuilder.CreateTable(
  290. name: "Member",
  291. columns: table => new
  292. {
  293. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  294. .Annotation("SqlServer:Identity", "1, 1"),
  295. MemberGradeID = table.Column<int>(type: "int", nullable: true, comment: "회원등급 PK"),
  296. SID = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false, comment: "SID"),
  297. Email = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false, comment: "이메일"),
  298. Name = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "별명"),
  299. FullName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "본명"),
  300. FirstName = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "본명(성)"),
  301. LastName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "본명(이름)"),
  302. Password = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "비밀번호"),
  303. Intro = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: true, comment: "자기소개"),
  304. Summary = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "한마디"),
  305. Phone = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "연락처"),
  306. Birthday = table.Column<DateOnly>(type: "date", nullable: true, comment: "생년월일"),
  307. Gender = table.Column<int>(type: "int", nullable: true, comment: "성별"),
  308. Thunmbnail = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "썸네일"),
  309. Icon = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "아이콘"),
  310. IsEmailVerified = table.Column<bool>(type: "bit", nullable: false, comment: "이메일 인증 여부"),
  311. IsAuthCertified = table.Column<bool>(type: "bit", nullable: false, comment: "본인 인증 여부"),
  312. IsDenied = table.Column<bool>(type: "bit", nullable: false, comment: "차단 여부"),
  313. IsAdmin = table.Column<bool>(type: "bit", nullable: false, comment: "운영진 여부"),
  314. IsWithdraw = table.Column<bool>(type: "bit", nullable: false, comment: "탈퇴 여부"),
  315. IsCreator = table.Column<bool>(type: "bit", nullable: false, comment: "크리에이터 여부"),
  316. DeviceInfo = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: true, comment: "로그인 단말기 정보"),
  317. SignupIP = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "회원가입 시 IP"),
  318. LastLoginIp = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "마지막 로그인 IP"),
  319. IpAddress = table.Column<string>(type: "nvarchar(45)", maxLength: 45, nullable: true, comment: "IP Address"),
  320. UserAgent = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: true, comment: "User-agent"),
  321. LastLoginAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 로그인 일시"),
  322. LastEmailChangedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 이메일 변경 일시"),
  323. LastNameChangedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 별명 변경 일시"),
  324. LastSummaryChangedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 한마디 변경 일시"),
  325. LastIntroChangedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "마지막 자기소개 변경 일시"),
  326. EmailVerifiedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "이메일 인증 일시"),
  327. AuthCertifiedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "본인인증 일시"),
  328. PasswordUpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "비밀번호 변경 일시"),
  329. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "가입 일시"),
  330. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  331. DeletedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "탈퇴 일시"),
  332. DeniedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "차단 일시")
  333. },
  334. constraints: table =>
  335. {
  336. table.PrimaryKey("PK_Member", x => x.ID);
  337. table.ForeignKey(
  338. name: "FK_Member_MemberGrade_MemberGradeID",
  339. column: x => x.MemberGradeID,
  340. principalTable: "MemberGrade",
  341. principalColumn: "ID",
  342. onDelete: ReferentialAction.SetNull);
  343. },
  344. comment: "회원 정보");
  345. migrationBuilder.CreateTable(
  346. name: "Channel",
  347. columns: table => new
  348. {
  349. ID = table.Column<int>(type: "int", nullable: false)
  350. .Annotation("SqlServer:Identity", "1, 1"),
  351. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  352. SID = table.Column<string>(type: "nvarchar(24)", maxLength: 24, nullable: false, comment: "채널 ID"),
  353. Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false, comment: "채널 이름"),
  354. Handle = table.Column<string>(type: "nvarchar(30)", maxLength: 30, nullable: true, comment: "핸들"),
  355. YouTubeUrl = table.Column<string>(type: "nvarchar(255)", maxLength: 255, nullable: false, comment: "YouTube 채널 URL"),
  356. PlatformFeeRate = table.Column<decimal>(type: "decimal(5,2)", precision: 5, scale: 2, nullable: false, comment: "수수료(%)"),
  357. IsVerified = table.Column<bool>(type: "bit", nullable: false, comment: "인증 여부"),
  358. IsActive = table.Column<bool>(type: "bit", nullable: false, comment: "활성 여부"),
  359. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "수정 일시"),
  360. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  361. },
  362. constraints: table =>
  363. {
  364. table.PrimaryKey("PK_Channel", x => x.ID);
  365. table.ForeignKey(
  366. name: "FK_Channel_Member_MemberID",
  367. column: x => x.MemberID,
  368. principalTable: "Member",
  369. principalColumn: "ID",
  370. onDelete: ReferentialAction.Cascade);
  371. },
  372. comment: "채널 정보");
  373. migrationBuilder.CreateTable(
  374. name: "MemberApprove",
  375. columns: table => new
  376. {
  377. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  378. IsReceiveSMS = table.Column<bool>(type: "bit", nullable: false, comment: "SMS 수신 여부"),
  379. ReceiveSMSConsentAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "SMS 수신 동의 일시"),
  380. IsReceiveEmail = table.Column<bool>(type: "bit", nullable: false, comment: "E-MAIL 수신 여부"),
  381. ReceiveEmailConsentAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "E-MAIL 수신 동의 일시"),
  382. IsReceiveNote = table.Column<bool>(type: "bit", nullable: false, comment: "쪽지 수신 여부"),
  383. ReceiveNoteConsentAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "쪽지 수신 동의 일시"),
  384. IsDisclosureInvest = table.Column<bool>(type: "bit", nullable: false, comment: "투자 현황 공개 여부"),
  385. DisclosureInvestConsentAt = table.Column<DateTime>(type: "datetime2", nullable: true, comment: "투자 현황 공개 동의 일시")
  386. },
  387. constraints: table =>
  388. {
  389. table.PrimaryKey("PK_MemberApprove", x => x.MemberID);
  390. table.ForeignKey(
  391. name: "FK_MemberApprove_Member_MemberID",
  392. column: x => x.MemberID,
  393. principalTable: "Member",
  394. principalColumn: "ID",
  395. onDelete: ReferentialAction.Cascade);
  396. },
  397. comment: "회원 동의 및 수신 여부");
  398. migrationBuilder.CreateTable(
  399. name: "MemberEmailChangeLog",
  400. columns: table => new
  401. {
  402. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  403. .Annotation("SqlServer:Identity", "1, 1"),
  404. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  405. BeforeEmail = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: true, comment: "이전 이메일"),
  406. AfterEmail = table.Column<string>(type: "nvarchar(60)", maxLength: 60, nullable: false, comment: "바뀐 이메일"),
  407. Referer = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이전 페이지 주소"),
  408. IpAddress = table.Column<string>(type: "nvarchar(45)", maxLength: 45, nullable: true, comment: "IP Address"),
  409. UserAgent = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true, comment: "User Agent"),
  410. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  411. },
  412. constraints: table =>
  413. {
  414. table.PrimaryKey("PK_MemberEmailChangeLog", x => x.ID);
  415. table.ForeignKey(
  416. name: "FK_MemberEmailChangeLog_Member_MemberID",
  417. column: x => x.MemberID,
  418. principalTable: "Member",
  419. principalColumn: "ID",
  420. onDelete: ReferentialAction.Cascade);
  421. },
  422. comment: "사용자 이메일 변경 내역");
  423. migrationBuilder.CreateTable(
  424. name: "MemberIntroChangeLog",
  425. columns: table => new
  426. {
  427. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  428. .Annotation("SqlServer:Identity", "1, 1"),
  429. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  430. BeforeIntro = table.Column<string>(type: "nvarchar(3000)", maxLength: 3000, nullable: true, comment: "이전 자기소개"),
  431. AfterIntro = table.Column<string>(type: "nvarchar(3000)", maxLength: 3000, nullable: true, comment: "바꾼 자기소개"),
  432. Referer = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이전 페이지 주소"),
  433. IpAddress = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "IP Address"),
  434. UserAgent = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true, comment: "User Agent"),
  435. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  436. },
  437. constraints: table =>
  438. {
  439. table.PrimaryKey("PK_MemberIntroChangeLog", x => x.ID);
  440. table.ForeignKey(
  441. name: "FK_MemberIntroChangeLog_Member_MemberID",
  442. column: x => x.MemberID,
  443. principalTable: "Member",
  444. principalColumn: "ID",
  445. onDelete: ReferentialAction.Cascade);
  446. },
  447. comment: "자기소개 변경 내역");
  448. migrationBuilder.CreateTable(
  449. name: "MemberLoginLog",
  450. columns: table => new
  451. {
  452. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  453. .Annotation("SqlServer:Identity", "1, 1"),
  454. MemberID = table.Column<int>(type: "int", nullable: true, comment: "회원 ID"),
  455. Success = table.Column<bool>(type: "bit", nullable: false, comment: "로그인 성공 여부 (0: 실패, 1: 성공)"),
  456. Account = table.Column<string>(type: "nvarchar(120)", maxLength: 120, nullable: false, comment: "로그인 시도한 계정"),
  457. Reason = table.Column<string>(type: "nvarchar(225)", maxLength: 225, nullable: true, comment: "실패 이유"),
  458. Referer = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이전 페이지 주소"),
  459. Url = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true, comment: "요청 주소"),
  460. IpAddress = table.Column<string>(type: "nvarchar(45)", maxLength: 45, nullable: true, comment: "IP Address"),
  461. UserAgent = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true, comment: "User Agent"),
  462. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  463. },
  464. constraints: table =>
  465. {
  466. table.PrimaryKey("PK_MemberLoginLog", x => x.ID);
  467. table.ForeignKey(
  468. name: "FK_MemberLoginLog_Member_MemberID",
  469. column: x => x.MemberID,
  470. principalTable: "Member",
  471. principalColumn: "ID",
  472. onDelete: ReferentialAction.SetNull);
  473. },
  474. comment: "로그인 기록");
  475. migrationBuilder.CreateTable(
  476. name: "MemberNameChangeLog",
  477. columns: table => new
  478. {
  479. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  480. .Annotation("SqlServer:Identity", "1, 1"),
  481. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  482. BeforeName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "이전 별명"),
  483. AfterName = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: true, comment: "바꾼 별명"),
  484. Referer = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이전 페이지 주소"),
  485. IpAddress = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "IP Address"),
  486. UserAgent = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true, comment: "User Agent"),
  487. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  488. },
  489. constraints: table =>
  490. {
  491. table.PrimaryKey("PK_MemberNameChangeLog", x => x.ID);
  492. table.ForeignKey(
  493. name: "FK_MemberNameChangeLog_Member_MemberID",
  494. column: x => x.MemberID,
  495. principalTable: "Member",
  496. principalColumn: "ID",
  497. onDelete: ReferentialAction.Cascade);
  498. },
  499. comment: "별명 변경 내역");
  500. migrationBuilder.CreateTable(
  501. name: "MemberStats",
  502. columns: table => new
  503. {
  504. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  505. RowVersion = table.Column<byte[]>(type: "rowversion", rowVersion: true, nullable: false, comment: "동시성"),
  506. Exp = table.Column<long>(type: "bigint", nullable: false, comment: "경험치"),
  507. PostCount = table.Column<long>(type: "bigint", nullable: false, comment: "작성 게시글"),
  508. CommentCount = table.Column<long>(type: "bigint", nullable: false, comment: "작성 댓글"),
  509. LikeReceivedCount = table.Column<long>(type: "bigint", nullable: false, comment: "받은 좋아요 수"),
  510. LikeGivenCount = table.Column<long>(type: "bigint", nullable: false, comment: "누른 좋아요 수"),
  511. ReportedCount = table.Column<long>(type: "bigint", nullable: false, comment: "신고 당한 횟수"),
  512. BookmarkGivenCount = table.Column<long>(type: "bigint", nullable: false, comment: "즐겨찾기 글 수"),
  513. WarningCount = table.Column<int>(type: "int", nullable: false, comment: "경고 횟수"),
  514. SuspensionCount = table.Column<int>(type: "int", nullable: false, comment: "정지 횟수"),
  515. LoginCount = table.Column<long>(type: "bigint", nullable: false, comment: "로그인"),
  516. AttendanceCount = table.Column<long>(type: "bigint", nullable: false, comment: "출석"),
  517. FollowingCount = table.Column<long>(type: "bigint", nullable: false, comment: "구독 중"),
  518. FollowerCount = table.Column<long>(type: "bigint", nullable: false, comment: "구독자"),
  519. PaymentCount = table.Column<long>(type: "bigint", nullable: false, comment: "결제 횟수"),
  520. TotalPaidAmount = table.Column<long>(type: "bigint", nullable: false, comment: "누적 결제 금액"),
  521. TotalCanceledAmount = table.Column<long>(type: "bigint", nullable: false, comment: "누적 취소/환불 금액")
  522. },
  523. constraints: table =>
  524. {
  525. table.PrimaryKey("PK_MemberStats", x => x.MemberID);
  526. table.ForeignKey(
  527. name: "FK_MemberStats_Member_MemberID",
  528. column: x => x.MemberID,
  529. principalTable: "Member",
  530. principalColumn: "ID",
  531. onDelete: ReferentialAction.Cascade);
  532. },
  533. comment: "회원 활동 집계");
  534. migrationBuilder.CreateTable(
  535. name: "MemberSummaryChangeLog",
  536. columns: table => new
  537. {
  538. ID = table.Column<int>(type: "int", nullable: false, comment: "PK")
  539. .Annotation("SqlServer:Identity", "1, 1"),
  540. MemberID = table.Column<int>(type: "int", nullable: false, comment: "회원 ID"),
  541. BeforeSummary = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "이전 한마디"),
  542. AfterSummary = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true, comment: "바꾼 한마디"),
  543. Referer = table.Column<string>(type: "nvarchar(max)", nullable: true, comment: "이전 페이지 주소"),
  544. IpAddress = table.Column<string>(type: "nvarchar(15)", maxLength: 15, nullable: true, comment: "IP Address"),
  545. UserAgent = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true, comment: "User Agent"),
  546. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, comment: "등록 일시")
  547. },
  548. constraints: table =>
  549. {
  550. table.PrimaryKey("PK_MemberSummaryChangeLog", x => x.ID);
  551. table.ForeignKey(
  552. name: "FK_MemberSummaryChangeLog_Member_MemberID",
  553. column: x => x.MemberID,
  554. principalTable: "Member",
  555. principalColumn: "ID",
  556. onDelete: ReferentialAction.Cascade);
  557. },
  558. comment: "한마디 변경 내역");
  559. migrationBuilder.CreateTable(
  560. name: "Wallet",
  561. columns: table => new
  562. {
  563. ID = table.Column<int>(type: "int", nullable: false)
  564. .Annotation("SqlServer:Identity", "1, 1"),
  565. WalletKey = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
  566. MemberID = table.Column<int>(type: "int", nullable: false),
  567. UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: true),
  568. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
  569. },
  570. constraints: table =>
  571. {
  572. table.PrimaryKey("PK_Wallet", x => x.ID);
  573. table.UniqueConstraint("AK_Wallet_WalletKey", x => x.WalletKey);
  574. table.ForeignKey(
  575. name: "FK_Wallet_Member_MemberID",
  576. column: x => x.MemberID,
  577. principalTable: "Member",
  578. principalColumn: "ID",
  579. onDelete: ReferentialAction.Cascade);
  580. },
  581. comment: "회원 지갑");
  582. migrationBuilder.CreateTable(
  583. name: "WalletBalance",
  584. columns: table => new
  585. {
  586. ID = table.Column<int>(type: "int", nullable: false)
  587. .Annotation("SqlServer:Identity", "1, 1"),
  588. WalletKey = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
  589. Type = table.Column<int>(type: "int", nullable: false),
  590. Amount = table.Column<decimal>(type: "decimal(18,0)", precision: 18, scale: 0, nullable: false),
  591. Currency = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false)
  592. },
  593. constraints: table =>
  594. {
  595. table.PrimaryKey("PK_WalletBalance", x => x.ID);
  596. table.ForeignKey(
  597. name: "FK_WalletBalance_Wallet_WalletKey",
  598. column: x => x.WalletKey,
  599. principalTable: "Wallet",
  600. principalColumn: "WalletKey",
  601. onDelete: ReferentialAction.Cascade);
  602. },
  603. comment: "회원 지갑 잔액");
  604. migrationBuilder.CreateTable(
  605. name: "WalletTransaction",
  606. columns: table => new
  607. {
  608. ID = table.Column<int>(type: "int", nullable: false)
  609. .Annotation("SqlServer:Identity", "1, 1"),
  610. WalletKey = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
  611. BalanceType = table.Column<int>(type: "int", nullable: false),
  612. TxType = table.Column<int>(type: "int", nullable: false),
  613. Amount = table.Column<decimal>(type: "decimal(18,0)", precision: 18, scale: 0, nullable: false),
  614. Currency = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
  615. BalanceAfter = table.Column<decimal>(type: "decimal(18,0)", precision: 18, scale: 0, nullable: false),
  616. BalanceAfterCurrency = table.Column<string>(type: "nvarchar(10)", maxLength: 10, nullable: false),
  617. Reason = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: false),
  618. RefID = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
  619. UserID = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true),
  620. Memo = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: true),
  621. CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
  622. },
  623. constraints: table =>
  624. {
  625. table.PrimaryKey("PK_WalletTransaction", x => x.ID);
  626. table.ForeignKey(
  627. name: "FK_WalletTransaction_Wallet_WalletKey",
  628. column: x => x.WalletKey,
  629. principalTable: "Wallet",
  630. principalColumn: "WalletKey",
  631. onDelete: ReferentialAction.Cascade);
  632. },
  633. comment: "회원 거래 장부");
  634. migrationBuilder.CreateIndex(
  635. name: "IX_BannerItem_IsActive",
  636. table: "BannerItem",
  637. column: "IsActive");
  638. migrationBuilder.CreateIndex(
  639. name: "IX_BannerItem_Order",
  640. table: "BannerItem",
  641. column: "Order");
  642. migrationBuilder.CreateIndex(
  643. name: "IX_BannerItem_PositionID",
  644. table: "BannerItem",
  645. column: "PositionID");
  646. migrationBuilder.CreateIndex(
  647. name: "IX_BannerItem_PositionID_Order_IsActive",
  648. table: "BannerItem",
  649. columns: new[] { "PositionID", "Order", "IsActive" });
  650. migrationBuilder.CreateIndex(
  651. name: "IX_BannerPosition_Code",
  652. table: "BannerPosition",
  653. column: "Code",
  654. unique: true);
  655. migrationBuilder.CreateIndex(
  656. name: "IX_BannerPosition_Code_IsActive",
  657. table: "BannerPosition",
  658. columns: new[] { "Code", "IsActive" });
  659. migrationBuilder.CreateIndex(
  660. name: "IX_BannerPosition_IsActive",
  661. table: "BannerPosition",
  662. column: "IsActive");
  663. migrationBuilder.CreateIndex(
  664. name: "IX_Channel_Handle",
  665. table: "Channel",
  666. column: "Handle",
  667. unique: true,
  668. filter: "[Handle] IS NOT NULL");
  669. migrationBuilder.CreateIndex(
  670. name: "IX_Channel_MemberID",
  671. table: "Channel",
  672. column: "MemberID",
  673. unique: true);
  674. migrationBuilder.CreateIndex(
  675. name: "IX_Channel_MemberID_IsActive",
  676. table: "Channel",
  677. columns: new[] { "MemberID", "IsActive" });
  678. migrationBuilder.CreateIndex(
  679. name: "IX_Channel_MemberID_IsVerified",
  680. table: "Channel",
  681. columns: new[] { "MemberID", "IsVerified" });
  682. migrationBuilder.CreateIndex(
  683. name: "IX_Channel_MemberID_IsVerified_IsActive",
  684. table: "Channel",
  685. columns: new[] { "MemberID", "IsVerified", "IsActive" });
  686. migrationBuilder.CreateIndex(
  687. name: "IX_Channel_Name",
  688. table: "Channel",
  689. column: "Name",
  690. unique: true);
  691. migrationBuilder.CreateIndex(
  692. name: "IX_Channel_SID",
  693. table: "Channel",
  694. column: "SID",
  695. unique: true);
  696. migrationBuilder.CreateIndex(
  697. name: "IX_Channel_YouTubeUrl",
  698. table: "Channel",
  699. column: "YouTubeUrl",
  700. unique: true);
  701. migrationBuilder.CreateIndex(
  702. name: "IX_Document_Code",
  703. table: "Document",
  704. column: "Code",
  705. unique: true);
  706. migrationBuilder.CreateIndex(
  707. name: "IX_Document_Code_IsActive",
  708. table: "Document",
  709. columns: new[] { "Code", "IsActive" });
  710. migrationBuilder.CreateIndex(
  711. name: "IX_Document_IsActive",
  712. table: "Document",
  713. column: "IsActive");
  714. migrationBuilder.CreateIndex(
  715. name: "IX_Document_Subject",
  716. table: "Document",
  717. column: "Subject");
  718. migrationBuilder.CreateIndex(
  719. name: "IX_EmailVerifyNumber_Code",
  720. table: "EmailVerifyNumber",
  721. column: "Code");
  722. migrationBuilder.CreateIndex(
  723. name: "IX_EmailVerifyNumber_Email",
  724. table: "EmailVerifyNumber",
  725. column: "Email");
  726. migrationBuilder.CreateIndex(
  727. name: "IX_EmailVerifyNumber_Expiration",
  728. table: "EmailVerifyNumber",
  729. column: "Expiration");
  730. migrationBuilder.CreateIndex(
  731. name: "IX_EmailVerifyNumber_IsVerified",
  732. table: "EmailVerifyNumber",
  733. column: "IsVerified");
  734. migrationBuilder.CreateIndex(
  735. name: "IX_EmailVerifyNumber_Type",
  736. table: "EmailVerifyNumber",
  737. column: "Type");
  738. migrationBuilder.CreateIndex(
  739. name: "IX_EmailVerifyNumber_Type_Code",
  740. table: "EmailVerifyNumber",
  741. columns: new[] { "Type", "Code" });
  742. migrationBuilder.CreateIndex(
  743. name: "IX_EmailVerifyNumber_Type_Code_IsVerified",
  744. table: "EmailVerifyNumber",
  745. columns: new[] { "Type", "Code", "IsVerified" });
  746. migrationBuilder.CreateIndex(
  747. name: "IX_EmailVerifyToken_Email",
  748. table: "EmailVerifyToken",
  749. column: "Email");
  750. migrationBuilder.CreateIndex(
  751. name: "IX_EmailVerifyToken_Expiration",
  752. table: "EmailVerifyToken",
  753. column: "Expiration");
  754. migrationBuilder.CreateIndex(
  755. name: "IX_EmailVerifyToken_IsVerified",
  756. table: "EmailVerifyToken",
  757. column: "IsVerified");
  758. migrationBuilder.CreateIndex(
  759. name: "IX_EmailVerifyToken_Token",
  760. table: "EmailVerifyToken",
  761. column: "Token");
  762. migrationBuilder.CreateIndex(
  763. name: "IX_EmailVerifyToken_Type",
  764. table: "EmailVerifyToken",
  765. column: "Type");
  766. migrationBuilder.CreateIndex(
  767. name: "IX_EmailVerifyToken_Type_Email_Token",
  768. table: "EmailVerifyToken",
  769. columns: new[] { "Type", "Email", "Token" });
  770. migrationBuilder.CreateIndex(
  771. name: "IX_EmailVerifyToken_Type_Email_Token_IsVerified",
  772. table: "EmailVerifyToken",
  773. columns: new[] { "Type", "Email", "Token", "IsVerified" });
  774. migrationBuilder.CreateIndex(
  775. name: "IX_FaqCategory_Code",
  776. table: "FaqCategory",
  777. column: "Code",
  778. unique: true);
  779. migrationBuilder.CreateIndex(
  780. name: "IX_FaqCategory_Code_Order_IsActive",
  781. table: "FaqCategory",
  782. columns: new[] { "Code", "Order", "IsActive" });
  783. migrationBuilder.CreateIndex(
  784. name: "IX_FaqCategory_Order_IsActive",
  785. table: "FaqCategory",
  786. columns: new[] { "Order", "IsActive" });
  787. migrationBuilder.CreateIndex(
  788. name: "IX_FaqItem_CategoryID",
  789. table: "FaqItem",
  790. column: "CategoryID");
  791. migrationBuilder.CreateIndex(
  792. name: "IX_FaqItem_CategoryID_Order_IsActive",
  793. table: "FaqItem",
  794. columns: new[] { "CategoryID", "Order", "IsActive" });
  795. migrationBuilder.CreateIndex(
  796. name: "IX_FaqItem_IsActive",
  797. table: "FaqItem",
  798. column: "IsActive");
  799. migrationBuilder.CreateIndex(
  800. name: "IX_FaqItem_Order",
  801. table: "FaqItem",
  802. column: "Order");
  803. migrationBuilder.CreateIndex(
  804. name: "IX_FaqItem_Order_IsActive",
  805. table: "FaqItem",
  806. columns: new[] { "Order", "IsActive" });
  807. migrationBuilder.CreateIndex(
  808. name: "IX_Member_CreatedAt",
  809. table: "Member",
  810. column: "CreatedAt");
  811. migrationBuilder.CreateIndex(
  812. name: "IX_Member_DeletedAt",
  813. table: "Member",
  814. column: "DeletedAt");
  815. migrationBuilder.CreateIndex(
  816. name: "IX_Member_Email",
  817. table: "Member",
  818. column: "Email",
  819. unique: true);
  820. migrationBuilder.CreateIndex(
  821. name: "IX_Member_FullName",
  822. table: "Member",
  823. column: "FullName");
  824. migrationBuilder.CreateIndex(
  825. name: "IX_Member_Gender",
  826. table: "Member",
  827. column: "Gender");
  828. migrationBuilder.CreateIndex(
  829. name: "IX_Member_IsAdmin",
  830. table: "Member",
  831. column: "IsAdmin");
  832. migrationBuilder.CreateIndex(
  833. name: "IX_Member_IsAuthCertified",
  834. table: "Member",
  835. column: "IsAuthCertified");
  836. migrationBuilder.CreateIndex(
  837. name: "IX_Member_IsCreator",
  838. table: "Member",
  839. column: "IsCreator");
  840. migrationBuilder.CreateIndex(
  841. name: "IX_Member_IsDenied",
  842. table: "Member",
  843. column: "IsDenied");
  844. migrationBuilder.CreateIndex(
  845. name: "IX_Member_IsEmailVerified",
  846. table: "Member",
  847. column: "IsEmailVerified");
  848. migrationBuilder.CreateIndex(
  849. name: "IX_Member_IsWithdraw",
  850. table: "Member",
  851. column: "IsWithdraw");
  852. migrationBuilder.CreateIndex(
  853. name: "IX_Member_MemberGradeID",
  854. table: "Member",
  855. column: "MemberGradeID");
  856. migrationBuilder.CreateIndex(
  857. name: "IX_Member_Name",
  858. table: "Member",
  859. column: "Name",
  860. unique: true,
  861. filter: "[Name] IS NOT NULL");
  862. migrationBuilder.CreateIndex(
  863. name: "IX_Member_Phone",
  864. table: "Member",
  865. column: "Phone");
  866. migrationBuilder.CreateIndex(
  867. name: "IX_Member_SID",
  868. table: "Member",
  869. column: "SID",
  870. unique: true);
  871. migrationBuilder.CreateIndex(
  872. name: "IX_MemberEmailChangeLog_CreatedAt",
  873. table: "MemberEmailChangeLog",
  874. column: "CreatedAt");
  875. migrationBuilder.CreateIndex(
  876. name: "IX_MemberEmailChangeLog_MemberID",
  877. table: "MemberEmailChangeLog",
  878. column: "MemberID");
  879. migrationBuilder.CreateIndex(
  880. name: "IX_MemberGrade_EngName",
  881. table: "MemberGrade",
  882. column: "EngName",
  883. unique: true);
  884. migrationBuilder.CreateIndex(
  885. name: "IX_MemberGrade_IsActive",
  886. table: "MemberGrade",
  887. column: "IsActive");
  888. migrationBuilder.CreateIndex(
  889. name: "IX_MemberGrade_KorName",
  890. table: "MemberGrade",
  891. column: "KorName",
  892. unique: true);
  893. migrationBuilder.CreateIndex(
  894. name: "IX_MemberGrade_Order",
  895. table: "MemberGrade",
  896. column: "Order");
  897. migrationBuilder.CreateIndex(
  898. name: "IX_MemberGrade_Order_IsActive",
  899. table: "MemberGrade",
  900. columns: new[] { "Order", "IsActive" });
  901. migrationBuilder.CreateIndex(
  902. name: "IX_MemberIntroChangeLog_MemberID",
  903. table: "MemberIntroChangeLog",
  904. column: "MemberID");
  905. migrationBuilder.CreateIndex(
  906. name: "IX_MemberLoginLog_Account",
  907. table: "MemberLoginLog",
  908. column: "Account");
  909. migrationBuilder.CreateIndex(
  910. name: "IX_MemberLoginLog_MemberID",
  911. table: "MemberLoginLog",
  912. column: "MemberID");
  913. migrationBuilder.CreateIndex(
  914. name: "IX_MemberLoginLog_MemberID_Success",
  915. table: "MemberLoginLog",
  916. columns: new[] { "MemberID", "Success" });
  917. migrationBuilder.CreateIndex(
  918. name: "IX_MemberNameChangeLog_MemberID",
  919. table: "MemberNameChangeLog",
  920. column: "MemberID");
  921. migrationBuilder.CreateIndex(
  922. name: "IX_MemberSummaryChangeLog_MemberID",
  923. table: "MemberSummaryChangeLog",
  924. column: "MemberID");
  925. migrationBuilder.CreateIndex(
  926. name: "IX_Popup_Order",
  927. table: "Popup",
  928. column: "Order");
  929. migrationBuilder.CreateIndex(
  930. name: "IX_Popup_Order_IsActive",
  931. table: "Popup",
  932. columns: new[] { "Order", "IsActive" });
  933. migrationBuilder.CreateIndex(
  934. name: "IX_Popup_StartAt_EndAt_Order_IsActive",
  935. table: "Popup",
  936. columns: new[] { "StartAt", "EndAt", "Order", "IsActive" });
  937. migrationBuilder.CreateIndex(
  938. name: "IX_Wallet_MemberID",
  939. table: "Wallet",
  940. column: "MemberID",
  941. unique: true);
  942. migrationBuilder.CreateIndex(
  943. name: "IX_Wallet_WalletKey",
  944. table: "Wallet",
  945. column: "WalletKey",
  946. unique: true);
  947. migrationBuilder.CreateIndex(
  948. name: "IX_WalletBalance_WalletKey_Type",
  949. table: "WalletBalance",
  950. columns: new[] { "WalletKey", "Type" },
  951. unique: true);
  952. migrationBuilder.CreateIndex(
  953. name: "IX_WalletTransaction_CreatedAt",
  954. table: "WalletTransaction",
  955. column: "CreatedAt");
  956. migrationBuilder.CreateIndex(
  957. name: "IX_WalletTransaction_WalletKey",
  958. table: "WalletTransaction",
  959. column: "WalletKey");
  960. migrationBuilder.CreateIndex(
  961. name: "IX_WalletTransaction_WalletKey_CreatedAt",
  962. table: "WalletTransaction",
  963. columns: new[] { "WalletKey", "CreatedAt" });
  964. }
  965. /// <inheritdoc />
  966. protected override void Down(MigrationBuilder migrationBuilder)
  967. {
  968. migrationBuilder.DropTable(
  969. name: "BannerItem");
  970. migrationBuilder.DropTable(
  971. name: "Channel");
  972. migrationBuilder.DropTable(
  973. name: "Config");
  974. migrationBuilder.DropTable(
  975. name: "Document");
  976. migrationBuilder.DropTable(
  977. name: "EmailVerifyNumber");
  978. migrationBuilder.DropTable(
  979. name: "EmailVerifyToken");
  980. migrationBuilder.DropTable(
  981. name: "FaqItem");
  982. migrationBuilder.DropTable(
  983. name: "MemberApprove");
  984. migrationBuilder.DropTable(
  985. name: "MemberEmailChangeLog");
  986. migrationBuilder.DropTable(
  987. name: "MemberIntroChangeLog");
  988. migrationBuilder.DropTable(
  989. name: "MemberLoginLog");
  990. migrationBuilder.DropTable(
  991. name: "MemberNameChangeLog");
  992. migrationBuilder.DropTable(
  993. name: "MemberStats");
  994. migrationBuilder.DropTable(
  995. name: "MemberSummaryChangeLog");
  996. migrationBuilder.DropTable(
  997. name: "Popup");
  998. migrationBuilder.DropTable(
  999. name: "WalletBalance");
  1000. migrationBuilder.DropTable(
  1001. name: "WalletTransaction");
  1002. migrationBuilder.DropTable(
  1003. name: "BannerPosition");
  1004. migrationBuilder.DropTable(
  1005. name: "FaqCategory");
  1006. migrationBuilder.DropTable(
  1007. name: "Wallet");
  1008. migrationBuilder.DropTable(
  1009. name: "Member");
  1010. migrationBuilder.DropTable(
  1011. name: "MemberGrade");
  1012. }
  1013. }
  1014. }