{"id":22113,"date":"2025-12-26T09:30:00","date_gmt":"2025-12-26T00:30:00","guid":{"rendered":"https:\/\/itport.cloud\/?p=22113"},"modified":"2026-01-17T23:30:56","modified_gmt":"2026-01-17T14:30:56","slug":"post-22113","status":"publish","type":"post","link":"https:\/\/itport.cloud\/?p=22113","title":{"rendered":"\u3010\u7b2c\u4e00\u56de\u3011\u30bf\u30b9\u30af\u7ba1\u7406\u30a2\u30d7\u30ea\u3092\u4f5c\u308d\u3046"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"1\">\u76ee\u6b21<\/h2>\n\n\n\n<p><a href=\"#1\" data-type=\"internal\" data-id=\"#1\">\u76ee\u6b21<\/a><br><a href=\"#2\" data-type=\"internal\" data-id=\"#2\">\u306f\u3058\u3081\u306b<\/a><br><a href=\"#3\" data-type=\"internal\" data-id=\"#3\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/a><br><a href=\"#4\" data-type=\"internal\" data-id=\"#4\">DB\u63a5\u7d9a\u6e96\u5099<\/a><br><a href=\"#5\" data-type=\"internal\" data-id=\"#5\">DB\u8a2d\u8a08<\/a><br><a href=\"#6\" data-type=\"internal\" data-id=\"#6\">PostgreSQL\u63a5\u7d9a\u6587\u5b57\u5217\u306e\u8a2d\u5b9a<\/a><br><a href=\"#7\" data-type=\"internal\" data-id=\"#7\">Model\u30af\u30e9\u30b9\u8ffd\u52a0<\/a><br><a href=\"#8\" data-type=\"internal\" data-id=\"#8\">DbContext\u4f5c\u6210<\/a><br><a href=\"#9\" data-type=\"internal\" data-id=\"#9\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c<\/a><br><a href=\"#10\" data-type=\"internal\" data-id=\"#10\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f5c\u6210<\/a><br><a href=\"#11\" data-type=\"internal\" data-id=\"#11\">\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/a><br><a href=\"#12\" data-type=\"internal\" data-id=\"#12\">\u4ed5\u4e0a\u3052<\/a><br><a href=\"#13\" data-type=\"internal\" data-id=\"#13\">\u5b9f\u884c<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"2\">\u306f\u3058\u3081\u306b<\/h2>\n\n\n\n<p>\u4eca\u56de\u3082\u5f15\u304d\u7d9a\u304d\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5b66\u7fd2\u306e\u4e00\u74b0\u3068\u3057\u3066C#\u3067\u30a2\u30d7\u30ea\u4f5c\u6210\u3092\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<br>\u4eca\u56de\u4f5c\u6210\u3059\u308b\u306e\u306f\u300c\u30bf\u30b9\u30af\u7ba1\u7406\u30a2\u30d7\u30ea\u300d\u3067\u3059\u3002<br>\u79c1\u81ea\u8eab\u3001\u30bf\u30b9\u30af\u7ba1\u7406\u304c\u82e6\u624b\u3067Google\u30ab\u30ec\u30f3\u30c0\u30fc\u306b\u4e88\u5b9a\u3092\u5165\u308c\u305f\u308a\u3001ToDo\u30ea\u30b9\u30c8\u306b\u66f8\u3044\u305f\u308a<br>\u30e1\u30e2\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3057\u305f\u308a\u3001\u7d19\u306b\u8a18\u8f09\u3057\u305f\u308a\u3068\u8272\u3005\u8a66\u3057\u307e\u3057\u305f\u304c\u3069\u308c\u3082\u7d9a\u304b\u305a\u3057\u3063\u304f\u308a\u3053\u306a\u3044\u306e\u3067\u6298\u89d2\u3060\u304b\u3089<br>\u52c9\u5f37\u304c\u3066\u3089\u81ea\u5206\u3067\u4f5c\u3063\u3066\u307f\u3088\u3046\u3068\u601d\u3044\u4eca\u56de\u4f5c\u6210\u3092\u6c7a\u610f\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"3\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h2>\n\n\n\n<p>\u305d\u308c\u3067\u306f\u3053\u308c\u304b\u3089\u6bce\u5ea6\u306e\u3088\u3046\u306bVisual studio\u3092\u7acb\u3061\u4e0a\u3052\u3066\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3068\u3053\u308d\u304b\u3089\u59cb\u3081\u307e\u3059\u3002<br>Visual studio\u3092\u7acb\u3061\u4e0a\u3052\u3066\u300c\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u300d\u3092\u30af\u30ea\u30c3\u30af<br>\u300cASP.NET Core Web \u30a2\u30d7\u30ea (Model-View-Controller)\u300d\u3092\u9078\u629e<br>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306f\u300cTaskManager\u300d\u3001\u4fdd\u5b58\u5148\u306f\u4efb\u610f\u306e\u5834\u6240\u3092\u9078\u629e\u3057\u6b21\u3078<br>\u8ffd\u52a0\u60c5\u5831\u90e8\u5206\u306f\u3001\u4eca\u56de\u306e\u30bf\u30b9\u30af\u7ba1\u7406\u30a2\u30d7\u30ea\u306f\u5c11\u3057\u96e3\u6613\u5ea6\u3092\u4e0a\u3052\u3066\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9023\u643a\u3084\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3092\u4ed8\u3051\u305f\u3044\u306e\u3067\u3001<br>\u8a8d\u8a3c\u306e\u7a2e\u985e\u306f\u300c\u500b\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u300d\u3092\u9078\u629e\u3057\u3066\u4f5c\u6210\u3092\u30af\u30ea\u30c3\u30af<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"4\">DB\u63a5\u7d9a\u6e96\u5099<\/h2>\n\n\n\n<p>DB\u306b\u306f\u300cPostgreSQL\u300d\u3092\u4f7f\u7528\u3059\u308b\u306e\u3067\u4e8b\u524d\u6e96\u5099\u3068\u3057\u3066NuGet\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304d\u307e\u3059<br>Visual Studio\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u30b3\u30f3\u30bd\u30fc\u30eb\u3092\u958b\u3044\u3066\u4e0b\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore -Version 8.0.10\nInstall-Package Npgsql.EntityFrameworkCore.PostgreSQL -Version 8.0.10\nInstall-Package Microsoft.EntityFrameworkCore.Tools -Version 8.0.10<\/code><\/pre>\n\n\n\n<p>\u4eca\u56de\u306f.NET8.0\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u306e\u3067\u5404\u30d1\u30c3\u30b1\u30fc\u30b8\u3082\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u5408\u308f\u305b\u308b\u305f\u3081\u306b\u30d0\u30fc\u30b8\u30e7\u30f3\u6307\u5b9a\u3092\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u3057\u3066\u3044\u307e\u3059<br>\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u5408\u308f\u305b\u306a\u3044\u3068\u4e92\u63db\u6027\u304c\u306a\u3044\u3068\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"5\">DB\u8a2d\u8a08<\/h2>\n\n\n\n<p>\u30c6\u30fc\u30d6\u30eb\u69cb\u6210\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3068\u3057\u307e\u3059<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Tasks\uff08\u30bf\u30b9\u30af\u30c6\u30fc\u30d6\u30eb\uff09<\/td><td><\/td><\/tr><tr><td>Id<\/td><td>\u4e3b\u30ad\u30fc<\/td><\/tr><tr><td>Title<\/td><td>\u30bf\u30a4\u30c8\u30eb<\/td><\/tr><tr><td>Description<\/td><td>\u8aac\u660e<\/td><\/tr><tr><td>DueDate<\/td><td>\u671f\u9650<\/td><\/tr><tr><td>Priority<\/td><td>\u512a\u5148\u5ea6: \u9ad8\/\u4e2d\/\u4f4e<\/td><\/tr><tr><td>Status<\/td><td>\u30b9\u30c6\u30fc\u30bf\u30b9: \u672a\u7740\u624b\/\u9032\u884c\u4e2d\/\u5b8c\u4e86<\/td><\/tr><tr><td>CreatedAt<\/td><td>\u4f5c\u6210\u65e5\u6642<\/td><\/tr><tr><td>UpdatedAt<\/td><td>\u66f4\u65b0\u65e5\u6642<\/td><\/tr><tr><td>UserId<\/td><td>\u30e6\u30fc\u30b6\u30fcID &#8211; \u5916\u90e8\u30ad\u30fc<\/td><\/tr><tr><td>ProjectId<\/td><td>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8ID &#8211; \u5916\u90e8\u30ad\u30fc\u3001nullable<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Projects\uff08\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c6\u30fc\u30d6\u30eb\uff09<\/td><td><\/td><\/tr><tr><td> Id <\/td><td>\u4e3b\u30ad\u30fc<\/td><\/tr><tr><td>Name<\/td><td>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d<\/td><\/tr><tr><td>Description<\/td><td>\u8aac\u660e<\/td><\/tr><tr><td>UserId<\/td><td>\u30e6\u30fc\u30b6\u30fcID &#8211; \u5916\u90e8\u30ad\u30fc<\/td><\/tr><tr><td>CreatedAt<\/td><td>\u4f5c\u6210\u65e5\u6642<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Tags\uff08\u30bf\u30b0\u30c6\u30fc\u30d6\u30eb\uff09<\/td><td><\/td><\/tr><tr><td>Id<\/td><td>\u4e3b\u30ad\u30fc<\/td><\/tr><tr><td>Name<\/td><td>\u30bf\u30b0\u540d<\/td><\/tr><tr><td>UserId<\/td><td>\u30e6\u30fc\u30b6\u30fcID &#8211; \u5916\u90e8\u30ad\u30fc<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>TaskTags\uff08\u4e2d\u9593\u30c6\u30fc\u30d6\u30eb &#8211; \u591a\u5bfe\u591a\u306e\u95a2\u4fc2\uff09<\/td><td><\/td><\/tr><tr><td>TaskId<\/td><td>\u5916\u90e8\u30ad\u30fc<\/td><\/tr><tr><td>TagId<\/td><td>\u5916\u90e8\u30ad\u30fc<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"6\">PostgreSQL\u63a5\u7d9a\u6587\u5b57\u5217\u306e\u8a2d\u5b9a<\/h2>\n\n\n\n<p>appsettings.json\u306b\u4e0b\u8a18\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09\u3057\u307e\u3059<br>\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u969b\u306b\u306f\u4ee5\u4e0b\u306e\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044<br><br> Host=localhost \u2192 PostgreSQL\u304c\u52d5\u3044\u3066\u3044\u308b\u30b5\u30fc\u30d0\u30fc\uff08\u30ed\u30fc\u30ab\u30eb\u306e\u5834\u5408\u306f\u305d\u306e\u307e\u307e\uff09<br>Database=TaskManagerDb \u2192 \u4f5c\u6210\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d<br>Username=postgres \u2192 PostgreSQL\u306e\u30e6\u30fc\u30b6\u30fc\u540d<br>Password=PostgreSQL\u306b\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u969b\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"ConnectionStrings\": {\n    \"DefaultConnection\": \"Host=localhost;Database=TaskManagerDb;Username=postgres;Password=\u3042\u306a\u305f\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\"\n  },\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"7\">Model\u30af\u30e9\u30b9\u8ffd\u52a0<\/h2>\n\n\n\n<p>\u6b21\u306bModel\u30d5\u30a9\u30eb\u30c0\u306b\u65b0\u3057\u3044\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u304d\u307e\u3059<br>\u30af\u30e9\u30b9\u306e\u8ffd\u52a0\u65b9\u6cd5\u306f\u8ffd\u52a0\u3057\u305f\u3044\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u53f3\u30af\u30ea\u30c3\u30af\u2192\u8ffd\u52a0\u2192\u30af\u30e9\u30b9\u3088\u308a\u8ffd\u52a0\u3067\u304d\u307e\u3059<br>\u307e\u305a\u306fTaskPriority.cs\u3068\u3044\u3046\u540d\u524d\u306e\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\u3057\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace TaskManager.Models\n{\n    public enum TaskPriority\n    {\n        Low = 0,      \/\/ \u4f4e\n        Medium = 1,   \/\/ \u4e2d\n        High = 2      \/\/ \u9ad8\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7d9a\u3051\u3066TaskStatus.cs\u3068\u3044\u3046\u540d\u524d\u306e\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\u3057\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>namespace TaskManager.Models\n{\n    public enum TaskStatus\n    {\n        NotStarted = 0,  \/\/ \u672a\u7740\u624b\n        InProgress = 1,  \/\/ \u9032\u884c\u4e2d\n        Completed = 2    \/\/ \u5b8c\u4e86\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7d9a\u3051\u3066Project.cs\u3092\u8ffd\u52a0\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.ComponentModel.DataAnnotations;\n\nnamespace TaskManager.Models\n{\n    public class Project\n    {\n        public int Id { get; set; }\n\n        &#91;Required(ErrorMessage = \"\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u306f\u5fc5\u9808\u3067\u3059\")]\n        &#91;StringLength(100)]\n        public string Name { get; set; } = string.Empty;\n\n        &#91;StringLength(500)]\n        public string? Description { get; set; }\n\n        public DateTime CreatedAt { get; set; } = DateTime.UtcNow;\n\n        &#91;Required]\n        public string UserId { get; set; } = string.Empty;\n\n        public ICollection&lt;TaskItem&gt; Tasks { get; set; } = new List&lt;TaskItem&gt;();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7d9a\u3051\u3066Tag.cs\u3092\u8ffd\u52a0\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.ComponentModel.DataAnnotations;\n\nnamespace TaskManager.Models\n{\n    public class Tag\n    {\n        public int Id { get; set; }\n\n        &#91;Required(ErrorMessage = \"\u30bf\u30b0\u540d\u306f\u5fc5\u9808\u3067\u3059\")]\n        &#91;StringLength(50)]\n        public string Name { get; set; } = string.Empty;\n\n        &#91;Required]\n        public string UserId { get; set; } = string.Empty;\n\n        public ICollection&lt;TaskItem&gt; Tasks { get; set; } = new List&lt;TaskItem&gt;();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u6700\u5f8c\u306b\u30e1\u30a4\u30f3\u306eTaskItem.cs\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.ComponentModel.DataAnnotations;\n\nnamespace TaskManager.Models\n{\n    public class TaskItem\n    {\n        public int Id { get; set; }\n\n        &#91;Required(ErrorMessage = \"\u30bf\u30a4\u30c8\u30eb\u306f\u5fc5\u9808\u3067\u3059\")]\n        &#91;StringLength(200, ErrorMessage = \"\u30bf\u30a4\u30c8\u30eb\u306f200\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\")]\n        public string Title { get; set; } = string.Empty;\n\n        &#91;StringLength(1000, ErrorMessage = \"\u8aac\u660e\u306f1000\u6587\u5b57\u4ee5\u5185\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\")]\n        public string? Description { get; set; }\n\n        &#91;DataType(DataType.Date)]\n        public DateTime? DueDate { get; set; }\n\n        public TaskPriority Priority { get; set; } = TaskPriority.Medium;\n\n        public TaskStatus Status { get; set; } = TaskStatus.NotStarted;\n\n        public DateTime CreatedAt { get; set; } = DateTime.UtcNow;\n\n        public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;\n\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u3068\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\n        &#91;Required]\n        public string UserId { get; set; } = string.Empty;\n\n        \/\/ \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3068\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\n        public int? ProjectId { get; set; }\n        public Project? Project { get; set; }\n\n        \/\/ \u30bf\u30b0\u3068\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\n        public ICollection&lt;Tag&gt; Tags { get; set; } = new List&lt;Tag&gt;();\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"8\"><strong>DbContext<\/strong>\u4f5c\u6210<\/h2>\n\n\n\n<p>Data\u30d5\u30a9\u30eb\u30c0\u306bApplicationDbContext.cs\u3092\u8ffd\u52a0\u3057\u307e\u3059<br>\u203b\u65e2\u306b\u3042\u308b\u5834\u5408\u306f\u305d\u3061\u3089\u306e\u4e2d\u8eab\u3092\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u306b\u66f8\u304d\u63db\u3048\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.AspNetCore.Identity.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore;\nusing TaskManager.Models;\n\nnamespace TaskManager.Data\n{\n    public class ApplicationDbContext : IdentityDbContext\n    {\n        public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options)\n            : base(options)\n        {\n        }\n\n        \/\/ DbSet\u3092\u8ffd\u52a0\u3001\u5b8c\u5168\u4fee\u98fe\u540d\n        public DbSet&lt;TaskItem&gt; TaskItems { get; set; } = null!;\n        public DbSet&lt;Project&gt; Projects { get; set; } = null!;\n        public DbSet&lt;Tag&gt; Tags { get; set; } = null!;\n\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\n        {\n            base.OnModelCreating(modelBuilder);\n\n            \/\/ TaskItems\n            modelBuilder.Entity&lt;TaskItem&gt;().ToTable(\"TaskItems\");\n\n            \/\/ Task\u3068Tag\u306e\u591a\u5bfe\u591a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u8a2d\u5b9a\n            modelBuilder.Entity&lt;TaskItem&gt;()\n                .HasMany(t =&gt; t.Tags)\n                .WithMany(tag =&gt; tag.Tasks)\n                .UsingEntity(j =&gt; j.ToTable(\"TaskTags\"));\n\n            \/\/ Task\u3068Project\u306e\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u8a2d\u5b9a\n            modelBuilder.Entity&lt;TaskItem&gt;()\n                .HasOne(t =&gt; t.Project)\n                .WithMany(p =&gt; p.Tasks)\n                .HasForeignKey(t =&gt; t.ProjectId)\n                .OnDelete(DeleteBehavior.SetNull);\n\n            \/\/ \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u8ffd\u52a0\n            modelBuilder.Entity&lt;TaskItem&gt;()\n                .HasIndex(t =&gt; t.Status);\n\n            modelBuilder.Entity&lt;TaskItem&gt;()\n                .HasIndex(t =&gt; t.DueDate);\n\n            modelBuilder.Entity&lt;TaskItem&gt;()\n                .HasIndex(t =&gt; t.UserId);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>Program.cs\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u4fee\u6b63\u3057\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.AspNetCore.Identity;\nusing Microsoft.EntityFrameworkCore;\nusing TaskManager.Data;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nvar connectionString = builder.Configuration.GetConnectionString(\"DefaultConnection\") ?? throw new InvalidOperationException(\"Connection string 'DefaultConnection' not found.\");\n\nbuilder.Services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;\n    options.UseNpgsql(connectionString));\n\nbuilder.Services.AddDatabaseDeveloperPageExceptionFilter();\n\nbuilder.Services.AddDefaultIdentity&lt;IdentityUser&gt;(options =&gt;\n{\n    options.SignIn.RequireConfirmedAccount = false;\n    options.Password.RequireDigit = true;\n    options.Password.RequireLowercase = true;\n    options.Password.RequireUppercase = false;\n    options.Password.RequireNonAlphanumeric = false;\n    options.Password.RequiredLength = 6;\n})\n.AddEntityFrameworkStores&lt;ApplicationDbContext&gt;();\n\nbuilder.Services.AddControllersWithViews();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n    app.UseMigrationsEndPoint();\n}\nelse\n{\n    app.UseExceptionHandler(\"\/Home\/Error\");\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.UseAuthorization();\n\napp.MapControllerRoute(\n    name: \"areas\",\n    pattern: \"{area:exists}\/{controller=Home}\/{action=Index}\/{id?}\");\n\napp.MapControllerRoute(\n    name: \"default\",\n    pattern: \"{controller=Home}\/{action=Index}\/{id?}\");\n\napp.MapRazorPages();  \/\/ \u2190 \u3053\u308c\u91cd\u8981\uff01\n\napp.Run();<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"9\">\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c<\/h2>\n\n\n\n<p>\u3053\u3053\u307e\u3067\u30b3\u30fc\u30c9\u304c\u66f8\u3051\u305f\u3089\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\u3057\u307e\u3059<br>\u30d1\u30c3\u30b1\u30fc\u30b8\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u4e0b\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5165\u529b\u3057\u307e\u3059<br>\u5b9f\u884c\u306b\u6210\u529f\u3059\u308b\u3068PostgreSQL\u306b\u30c6\u30fc\u30d6\u30eb\u304c\u81ea\u52d5\u3067\u751f\u6210\u3055\u308c\u307e\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add-Migration InitialCreate\nUpdate-Database<\/code><\/pre>\n\n\n\n<p>\u6210\u529f\u3057\u305f\u306e\u3067PostgreSQL\u3092\u958b\u3044\u3066\u30c6\u30fc\u30d6\u30eb\u304c\u51fa\u6765\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059<br>\u7121\u4e8b\u306b\u30c6\u30fc\u30d6\u30eb\u304c\u4f5c\u6210\u3055\u308c\u3066\u3044\u307e\u3059\uff01\uff01<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"644\" src=\"https:\/\/itport.cloud\/wp-content\/uploads\/2025\/10\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-10-08-175115.png\" alt=\"\" class=\"wp-image-22118\" srcset=\"https:\/\/itport.cloud\/wp-content\/uploads\/2025\/10\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-10-08-175115.png 533w, https:\/\/itport.cloud\/wp-content\/uploads\/2025\/10\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-10-08-175115-248x300.png 248w, https:\/\/itport.cloud\/wp-content\/uploads\/2025\/10\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-10-08-175115-265x320.png 265w, https:\/\/itport.cloud\/wp-content\/uploads\/2025\/10\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-10-08-175115-530x640.png 530w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"10\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f5c\u6210<\/h2>\n\n\n\n<p>DB\u306e\u69cb\u7bc9\u304c\u6210\u529f\u3057\u305f\u306e\u3067\u7d9a\u3051\u3066\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u4f5c\u6210\u3057\u3066\u3044\u304d\u307e\u3059\u3002<br> Controllers\u30d5\u30a9\u30eb\u30c0\u3067\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc <br>\u300cMVC\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc &#8211; \u7a7a\u300d\u3092\u9078\u629e\u3057\u3001\u540d\u524d\u3092 \u300cTaskItemsController\u300d\u306b\u3057\u3066\u4f5c\u6210<br>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.AspNetCore.Authorization;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.EntityFrameworkCore;\nusing TaskManager.Data;\nusing TaskManager.Models;\nusing System.Security.Claims;\n\nnamespace TaskManager.Controllers\n{\n    &#91;Authorize]\n    public class TaskItemsController : Controller\n    {\n        private readonly ApplicationDbContext _context;\n\n        public TaskItemsController(ApplicationDbContext context)\n        {\n            _context = context;\n        }\n\n        \/\/ \u4e00\u89a7\u8868\u793a\uff08GET: TaskItems\uff09\n        public async Task&lt;IActionResult> Index()\n        {\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            var tasks = await _context.TaskItems\n                .Include(t => t.Project)\n                .Include(t => t.Tags)\n                .Where(t => t.UserId == userId)\n                .OrderByDescending(t => t.CreatedAt)\n                .ToListAsync();\n\n            return View(tasks);\n        }\n\n        \/\/ \u8a73\u7d30\u8868\u793a\uff08GET: TaskItems\/Details\/5\uff09\n        public async Task&lt;IActionResult> Details(int? id)\n        {\n            if (id == null)\n            {\n                return NotFound();\n            }\n\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            var taskItem = await _context.TaskItems\n                .Include(t => t.Project)\n                .Include(t => t.Tags)\n                .FirstOrDefaultAsync(m => m.Id == id &amp;&amp; m.UserId == userId);\n\n            if (taskItem == null)\n            {\n                return NotFound();\n            }\n\n            return View(taskItem);\n        }\n\n        \/\/ \u4f5c\u6210\u753b\u9762\u8868\u793a\uff08GET: TaskItems\/Create\uff09\n        public IActionResult Create()\n        {\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            ViewBag.Projects = _context.Projects\n                .Where(p => p.UserId == userId)\n                .ToList();\n\n            return View();\n        }\n\n        \/\/ \u4f5c\u6210\u51e6\u7406\uff08POST: TaskItems\/Create\uff09\n        &#91;HttpPost]\n        &#91;ValidateAntiForgeryToken]\n        public async Task&lt;IActionResult> Create(&#91;Bind(\"Title,Description,DueDate,Priority,Status,ProjectId\")] TaskItem taskItem)\n        {\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u5f37\u5236\u7684\u306b\u4fdd\u5b58\n            ModelState.Clear();\n            \n            taskItem.UserId = userId;\n            taskItem.CreatedAt = DateTime.UtcNow;\n            taskItem.UpdatedAt = DateTime.UtcNow;\n            \n            _context.Add(taskItem);\n            await _context.SaveChangesAsync();\n            \n            return RedirectToAction(nameof(Index));\n        }\n\n        \/\/ \u7de8\u96c6\u753b\u9762\u8868\u793a\uff08GET: TaskItems\/Edit\/5\uff09\n        public async Task&lt;IActionResult> Edit(int? id)\n        {\n            if (id == null)\n            {\n                return NotFound();\n            }\n\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            var taskItem = await _context.TaskItems\n                .FirstOrDefaultAsync(t => t.Id == id &amp;&amp; t.UserId == userId);\n\n            if (taskItem == null)\n            {\n                return NotFound();\n            }\n\n            ViewBag.Projects = _context.Projects\n                .Where(p => p.UserId == userId)\n                .ToList();\n\n            return View(taskItem);\n        }\n\n        \/\/ \u7de8\u96c6\u51e6\u7406\uff08POST: TaskItems\/Edit\/5\uff09\n        &#91;HttpPost]\n        &#91;ValidateAntiForgeryToken]\n        public async Task&lt;IActionResult> Edit(int id, &#91;Bind(\"Id,Title,Description,DueDate,Priority,Status,ProjectId,CreatedAt\")] TaskItem taskItem)\n        {\n            if (id != taskItem.Id)\n            {\n                return NotFound();\n            }\n\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n\n            \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u3092\u30b9\u30ad\u30c3\u30d7\n            ModelState.Clear();\n            \n            try\n            {\n                taskItem.UserId = userId;\n                taskItem.UpdatedAt = DateTime.UtcNow;\n                \n                _context.Update(taskItem);\n                await _context.SaveChangesAsync();\n            }\n            catch (DbUpdateConcurrencyException)\n            {\n                if (!TaskItemExists(taskItem.Id))\n                {\n                    return NotFound();\n                }\n                else\n                {\n                    throw;\n                }\n            }\n            return RedirectToAction(nameof(Index));\n        }\n\n        \/\/ \u524a\u9664\u78ba\u8a8d\u753b\u9762\uff08GET: TaskItems\/Delete\/5\uff09\n        public async Task&lt;IActionResult> Delete(int? id)\n        {\n            if (id == null)\n            {\n                return NotFound();\n            }\n\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            var taskItem = await _context.TaskItems\n                .Include(t => t.Project)\n                .FirstOrDefaultAsync(m => m.Id == id &amp;&amp; m.UserId == userId);\n\n            if (taskItem == null)\n            {\n                return NotFound();\n            }\n\n            return View(taskItem);\n        }\n\n        \/\/ \u524a\u9664\u51e6\u7406\uff08POST: TaskItems\/Delete\/5\uff09\n        &#91;HttpPost, ActionName(\"Delete\")]\n        &#91;ValidateAntiForgeryToken]\n        public async Task&lt;IActionResult> DeleteConfirmed(int id)\n        {\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            \n            var taskItem = await _context.TaskItems\n                .FirstOrDefaultAsync(t => t.Id == id &amp;&amp; t.UserId == userId);\n\n            if (taskItem != null)\n            {\n                _context.TaskItems.Remove(taskItem);\n                await _context.SaveChangesAsync();\n            }\n\n            return RedirectToAction(nameof(Index));\n        }\n\n        private bool TaskItemExists(int id)\n        {\n            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);\n            return _context.TaskItems.Any(e => e.Id == id &amp;&amp; e.UserId == userId);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"11\">\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/h2>\n\n\n\n<p>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210<br>Views\u30d5\u30a9\u30eb\u30c0\u3067\u53f3\u30af\u30ea\u30c3\u30af\u2192\u8ffd\u52a0 \u2192 \u65b0\u3057\u3044\u30d5\u30a9\u30eb\u30c0\u30fc<br>\u30d5\u30a9\u30eb\u30c0\u540d\u3092\u300cTaskItems\u300d\u306b\u3057\u3066\u4f5c\u6210<br><br>1\u3064\u76ee: Index.cshtml\uff08\u4e00\u89a7\u753b\u9762\uff09\u3092\u4f5c\u6210<br>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3067\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30d3\u30e5\u30fc \u2192 Razor\u30d3\u30e5\u30fc<br>\u540d\u524d\u306f\u3092\u300cIndex\u300d \u306b\u3057\u3066\u4f5c\u6210<br> \u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@model IEnumerable&lt;TaskManager.Models.TaskItem&gt;\n\n@{\n    ViewData&#91;\"Title\"] = \"\u30bf\u30b9\u30af\u4e00\u89a7\";\n}\n\n&lt;div class=\"container mt-4\"&gt;\n    &lt;div class=\"d-flex justify-content-between align-items-center mb-4\"&gt;\n        &lt;h1&gt;@ViewData&#91;\"Title\"]&lt;\/h1&gt;\n        &lt;a asp-action=\"Create\" class=\"btn btn-primary\"&gt;\n            &lt;i class=\"bi bi-plus-circle\"&gt;&lt;\/i&gt; \u65b0\u3057\u3044\u30bf\u30b9\u30af\n        &lt;\/a&gt;\n    &lt;\/div&gt;\n\n    @if (!Model.Any())\n    {\n        &lt;div class=\"alert alert-info\"&gt;\n            &lt;i class=\"bi bi-info-circle\"&gt;&lt;\/i&gt; \u30bf\u30b9\u30af\u304c\u307e\u3060\u3042\u308a\u307e\u305b\u3093\u3002\u65b0\u3057\u3044\u30bf\u30b9\u30af\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\uff01\n        &lt;\/div&gt;\n    }\n    else\n    {\n        &lt;div class=\"row\"&gt;\n            @foreach (var item in Model)\n            {\n                &lt;div class=\"col-md-6 col-lg-4 mb-3\"&gt;\n                    &lt;div class=\"card h-100 shadow-sm\"&gt;\n                        &lt;div class=\"card-body\"&gt;\n                            &lt;h5 class=\"card-title\"&gt;\n                                @Html.DisplayFor(modelItem =&gt; item.Title)\n                            &lt;\/h5&gt;\n\n                            @if (!string.IsNullOrEmpty(item.Description))\n                            {\n                                &lt;p class=\"card-text text-muted\"&gt;\n                                    @(item.Description.Length &gt; 100 ? item.Description.Substring(0, 100) + \"...\" : item.Description)\n                                &lt;\/p&gt;\n                            }\n\n                            &lt;div class=\"mb-2\"&gt;\n                                @switch (item.Priority)\n                                {\n                                    case TaskManager.Models.TaskPriority.High:\n                                        &lt;span class=\"badge bg-danger\"&gt;\u9ad8\u512a\u5148\u5ea6&lt;\/span&gt;\n                                        break;\n                                    case TaskManager.Models.TaskPriority.Medium:\n                                        &lt;span class=\"badge bg-warning text-dark\"&gt;\u4e2d\u512a\u5148\u5ea6&lt;\/span&gt;\n                                        break;\n                                    case TaskManager.Models.TaskPriority.Low:\n                                        &lt;span class=\"badge bg-secondary\"&gt;\u4f4e\u512a\u5148\u5ea6&lt;\/span&gt;\n                                        break;\n                                }\n\n                                @switch (item.Status)\n                                {\n                                    case TaskManager.Models.TaskStatus.NotStarted:\n                                        &lt;span class=\"badge bg-light text-dark\"&gt;\u672a\u7740\u624b&lt;\/span&gt;\n                                        break;\n                                    case TaskManager.Models.TaskStatus.InProgress:\n                                        &lt;span class=\"badge bg-info\"&gt;\u9032\u884c\u4e2d&lt;\/span&gt;\n                                        break;\n                                    case TaskManager.Models.TaskStatus.Completed:\n                                        &lt;span class=\"badge bg-success\"&gt;\u5b8c\u4e86&lt;\/span&gt;\n                                        break;\n                                }\n                            &lt;\/div&gt;\n\n                            @if (item.DueDate.HasValue)\n                            {\n                                &lt;p class=\"card-text\"&gt;\n                                    &lt;small class=\"text-muted\"&gt;\n                                        &lt;i class=\"bi bi-calendar\"&gt;&lt;\/i&gt;\n                                        \u671f\u9650: @item.DueDate.Value.ToLocalTime().ToString(\"yyyy\/MM\/dd\")\n                                    &lt;\/small&gt;\n                                &lt;\/p&gt;\n                            }\n\n                            @if (item.Project != null)\n                            {\n                                &lt;p class=\"card-text\"&gt;\n                                    &lt;small class=\"text-muted\"&gt;\n                                        &lt;i class=\"bi bi-folder\"&gt;&lt;\/i&gt; @item.Project.Name\n                                    &lt;\/small&gt;\n                                &lt;\/p&gt;\n                            }\n                        &lt;\/div&gt;\n                        &lt;div class=\"card-footer bg-transparent\"&gt;\n                            &lt;a asp-action=\"Details\" asp-route-id=\"@item.Id\" class=\"btn btn-sm btn-outline-primary\"&gt;\u8a73\u7d30&lt;\/a&gt;\n                            &lt;a asp-action=\"Edit\" asp-route-id=\"@item.Id\" class=\"btn btn-sm btn-outline-secondary\"&gt;\u7de8\u96c6&lt;\/a&gt;\n                            &lt;a asp-action=\"Delete\" asp-route-id=\"@item.Id\" class=\"btn btn-sm btn-outline-danger\"&gt;\u524a\u9664&lt;\/a&gt;\n                        &lt;\/div&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n            }\n        &lt;\/div&gt;\n    }\n&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<p>2\u3064\u76ee: Create.cshtml \u3092\u4f5c\u6210<br>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3092\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30d3\u30e5\u30fc \u2192 Razor\u30d3\u30e5\u30fc<br>\u540d\u524d\u3092\u300cCreate\u300d \u306b\u3057\u3066\u4f5c\u6210<br>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@model TaskManager.Models.TaskItem\n@{\n    ViewData&#91;\"Title\"] = \"\u65b0\u3057\u3044\u30bf\u30b9\u30af\u3092\u4f5c\u6210\";\n}\n\n&lt;div class=\"container mt-4\">\n    &lt;div class=\"row justify-content-center\">\n        &lt;div class=\"col-md-8\">\n            &lt;h1>@ViewData&#91;\"Title\"]&lt;\/h1>\n            &lt;hr \/>\n            \n            &lt;form action=\"\/TaskItems\/Create\" method=\"post\">\n                @Html.AntiForgeryToken()\n                \n                &lt;div class=\"mb-3\">\n                    &lt;label for=\"Title\" class=\"form-label\">\u30bf\u30a4\u30c8\u30eb &lt;span class=\"text-danger\">*&lt;\/span>&lt;\/label>\n                    &lt;input type=\"text\" id=\"Title\" name=\"Title\" class=\"form-control\" placeholder=\"\u30bf\u30b9\u30af\u306e\u30bf\u30a4\u30c8\u30eb\u3092\u5165\u529b\" required \/>\n                &lt;\/div>\n                \n                &lt;div class=\"mb-3\">\n                    &lt;label for=\"Description\" class=\"form-label\">\u8aac\u660e&lt;\/label>\n                    &lt;textarea id=\"Description\" name=\"Description\" class=\"form-control\" rows=\"4\" placeholder=\"\u30bf\u30b9\u30af\u306e\u8a73\u7d30\u3092\u5165\u529b\">&lt;\/textarea>\n                &lt;\/div>\n                \n                &lt;div class=\"row\">\n                    &lt;div class=\"col-md-6 mb-3\">\n                        &lt;label for=\"Priority\" class=\"form-label\">\u512a\u5148\u5ea6&lt;\/label>\n                        &lt;select id=\"Priority\" name=\"Priority\" class=\"form-select\">\n                            &lt;option value=\"0\">\u4f4e&lt;\/option>\n                            &lt;option value=\"1\" selected>\u4e2d&lt;\/option>\n                            &lt;option value=\"2\">\u9ad8&lt;\/option>\n                        &lt;\/select>\n                    &lt;\/div>\n                    \n                    &lt;div class=\"col-md-6 mb-3\">\n                        &lt;label for=\"Status\" class=\"form-label\">\u30b9\u30c6\u30fc\u30bf\u30b9&lt;\/label>\n                        &lt;select id=\"Status\" name=\"Status\" class=\"form-select\">\n                            &lt;option value=\"0\" selected>\u672a\u7740\u624b&lt;\/option>\n                            &lt;option value=\"1\">\u9032\u884c\u4e2d&lt;\/option>\n                            &lt;option value=\"2\">\u5b8c\u4e86&lt;\/option>\n                        &lt;\/select>\n                    &lt;\/div>\n                &lt;\/div>\n                \n                &lt;div class=\"row\">\n                    &lt;div class=\"col-md-6 mb-3\">\n                        &lt;label for=\"DueDate\" class=\"form-label\">\u671f\u9650&lt;\/label>\n                        &lt;input type=\"date\" id=\"DueDate\" name=\"DueDate\" class=\"form-control\" \/>\n                    &lt;\/div>\n                    \n                    &lt;div class=\"col-md-6 mb-3\">\n                        &lt;label for=\"ProjectId\" class=\"form-label\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8&lt;\/label>\n                        &lt;select id=\"ProjectId\" name=\"ProjectId\" class=\"form-select\">\n                            &lt;option value=\"\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306a\u3057&lt;\/option>\n                            @if (ViewBag.Projects != null)\n                            {\n                                @foreach (var project in ViewBag.Projects as List&lt;TaskManager.Models.Project>)\n                                {\n                                    &lt;option value=\"@project.Id\">@project.Name&lt;\/option>\n                                }\n                            }\n                        &lt;\/select>\n                    &lt;\/div>\n                &lt;\/div>\n                \n                &lt;div class=\"mb-3\">\n                    &lt;button type=\"submit\" class=\"btn btn-primary\">\n                        \u4f5c\u6210\n                    &lt;\/button>\n                    &lt;a href=\"\/TaskItems\/Index\" class=\"btn btn-secondary\">\n                        \u30ad\u30e3\u30f3\u30bb\u30eb\n                    &lt;\/a>\n                &lt;\/div>\n            &lt;\/form>\n        &lt;\/div>\n    &lt;\/div>\n&lt;\/div>\n\n@section Scripts {\n    @{await Html.RenderPartialAsync(\"_ValidationScriptsPartial\");}\n}<\/code><\/pre>\n\n\n\n<p>3\u3064\u76ee: Details.cshtml\uff08\u8a73\u7d30\u753b\u9762\uff09\u3092\u4f5c\u6210<br>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3092\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30d3\u30e5\u30fc \u2192 Razor\u30d3\u30e5\u30fc<br>\u540d\u524d\u3092\u300cDetails\u300d \u306b\u3057\u3066\u4f5c\u6210<br>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@model TaskManager.Models.TaskItem\n\n@{\n    ViewData&#91;\"Title\"] = \"\u30bf\u30b9\u30af\u8a73\u7d30\";\n}\n\n&lt;div class=\"container mt-4\"&gt;\n    &lt;div class=\"row justify-content-center\"&gt;\n        &lt;div class=\"col-md-8\"&gt;\n            &lt;div class=\"d-flex justify-content-between align-items-center mb-3\"&gt;\n                &lt;h1&gt;@ViewData&#91;\"Title\"]&lt;\/h1&gt;\n                &lt;div&gt;\n                    &lt;a asp-action=\"Edit\" asp-route-id=\"@Model.Id\" class=\"btn btn-warning\"&gt;\n                        &lt;i class=\"bi bi-pencil\"&gt;&lt;\/i&gt; \u7de8\u96c6\n                    &lt;\/a&gt;\n                    &lt;a asp-action=\"Index\" class=\"btn btn-secondary\"&gt;\n                        &lt;i class=\"bi bi-arrow-left\"&gt;&lt;\/i&gt; \u4e00\u89a7\u306b\u623b\u308b\n                    &lt;\/a&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"card shadow-sm\"&gt;\n                &lt;div class=\"card-body\"&gt;\n                    &lt;h2 class=\"card-title mb-4\"&gt;@Html.DisplayFor(model =&gt; model.Title)&lt;\/h2&gt;\n\n                    &lt;dl class=\"row\"&gt;\n                        &lt;dt class=\"col-sm-3\"&gt;\u8aac\u660e&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (!string.IsNullOrEmpty(Model.Description))\n                            {\n                                &lt;p style=\"white-space: pre-wrap;\"&gt;@Model.Description&lt;\/p&gt;\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u8aac\u660e\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u512a\u5148\u5ea6&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @switch (Model.Priority)\n                            {\n                                case TaskManager.Models.TaskPriority.High:\n                                    &lt;span class=\"badge bg-danger\"&gt;\u9ad8\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskPriority.Medium:\n                                    &lt;span class=\"badge bg-warning text-dark\"&gt;\u4e2d\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskPriority.Low:\n                                    &lt;span class=\"badge bg-secondary\"&gt;\u4f4e\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u30b9\u30c6\u30fc\u30bf\u30b9&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @switch (Model.Status)\n                            {\n                                case TaskManager.Models.TaskStatus.NotStarted:\n                                    &lt;span class=\"badge bg-light text-dark\"&gt;\u672a\u7740\u624b&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskStatus.InProgress:\n                                    &lt;span class=\"badge bg-info\"&gt;\u9032\u884c\u4e2d&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskStatus.Completed:\n                                    &lt;span class=\"badge bg-success\"&gt;\u5b8c\u4e86&lt;\/span&gt;\n                                    break;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u671f\u9650&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (Model.DueDate.HasValue)\n                            {\n                                &lt;i class=\"bi bi-calendar\"&gt;&lt;\/i&gt; \n                                @Model.DueDate.Value.ToLocalTime().ToString(\"yyyy\u5e74MM\u6708dd\u65e5\")\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u671f\u9650\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (Model.Project != null)\n                            {\n                                &lt;i class=\"bi bi-folder\"&gt;&lt;\/i&gt; \n                                @Model.Project.Name\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u4f5c\u6210\u65e5\u6642&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @Model.CreatedAt.ToLocalTime().ToString(\"yyyy\u5e74MM\u6708dd\u65e5 HH:mm\")\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u66f4\u65b0\u65e5\u6642&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @Model.UpdatedAt.ToLocalTime().ToString(\"yyyy\u5e74MM\u6708dd\u65e5 HH:mm\")\n                        &lt;\/dd&gt;\n                    &lt;\/dl&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"mt-3\"&gt;\n                &lt;a asp-action=\"Delete\" asp-route-id=\"@Model.Id\" class=\"btn btn-danger\"&gt;\n                    &lt;i class=\"bi bi-trash\"&gt;&lt;\/i&gt; \u524a\u9664\n                &lt;\/a&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<p>4\u3064\u76ee: Edit.cshtml\uff08\u7de8\u96c6\u753b\u9762\uff09\u3092\u4f5c\u6210<br>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3092\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30d3\u30e5\u30fc \u2192 Razor\u30d3\u30e5\u30fc<br>\u540d\u524d\u3092\u300cEdit\u300d \u306b\u3057\u3066\u4f5c\u6210<br>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@model TaskManager.Models.TaskItem\n\n@{\n    ViewData&#91;\"Title\"] = \"\u30bf\u30b9\u30af\u3092\u7de8\u96c6\";\n}\n\n&lt;div class=\"container mt-4\"&gt;\n    &lt;div class=\"row justify-content-center\"&gt;\n        &lt;div class=\"col-md-8\"&gt;\n            &lt;h1&gt;@ViewData&#91;\"Title\"]&lt;\/h1&gt;\n            &lt;hr \/&gt;\n\n            &lt;form asp-action=\"Edit\" method=\"post\"&gt;\n                &lt;div asp-validation-summary=\"ModelOnly\" class=\"text-danger\"&gt;&lt;\/div&gt;\n\n                &lt;input type=\"hidden\" asp-for=\"Id\" \/&gt;\n                &lt;input type=\"hidden\" asp-for=\"CreatedAt\" \/&gt;\n\n                &lt;div class=\"mb-3\"&gt;\n                    &lt;label asp-for=\"Title\" class=\"form-label\"&gt;\u30bf\u30a4\u30c8\u30eb &lt;span class=\"text-danger\"&gt;*&lt;\/span&gt;&lt;\/label&gt;\n                    &lt;input asp-for=\"Title\" class=\"form-control\" placeholder=\"\u30bf\u30b9\u30af\u306e\u30bf\u30a4\u30c8\u30eb\u3092\u5165\u529b\" \/&gt;\n                    &lt;span asp-validation-for=\"Title\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                &lt;\/div&gt;\n\n                &lt;div class=\"mb-3\"&gt;\n                    &lt;label asp-for=\"Description\" class=\"form-label\"&gt;\u8aac\u660e&lt;\/label&gt;\n                    &lt;textarea asp-for=\"Description\" class=\"form-control\" rows=\"4\" placeholder=\"\u30bf\u30b9\u30af\u306e\u8a73\u7d30\u3092\u5165\u529b\"&gt;&lt;\/textarea&gt;\n                    &lt;span asp-validation-for=\"Description\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                &lt;\/div&gt;\n\n                &lt;div class=\"row\"&gt;\n                    &lt;div class=\"col-md-6 mb-3\"&gt;\n                        &lt;label asp-for=\"Priority\" class=\"form-label\"&gt;\u512a\u5148\u5ea6&lt;\/label&gt;\n                        &lt;select asp-for=\"Priority\" class=\"form-select\"&gt;\n                            &lt;option value=\"0\"&gt;\u4f4e&lt;\/option&gt;\n                            &lt;option value=\"1\"&gt;\u4e2d&lt;\/option&gt;\n                            &lt;option value=\"2\"&gt;\u9ad8&lt;\/option&gt;\n                        &lt;\/select&gt;\n                        &lt;span asp-validation-for=\"Priority\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                    &lt;\/div&gt;\n\n                    &lt;div class=\"col-md-6 mb-3\"&gt;\n                        &lt;label asp-for=\"Status\" class=\"form-label\"&gt;\u30b9\u30c6\u30fc\u30bf\u30b9&lt;\/label&gt;\n                        &lt;select asp-for=\"Status\" class=\"form-select\"&gt;\n                            &lt;option value=\"0\"&gt;\u672a\u7740\u624b&lt;\/option&gt;\n                            &lt;option value=\"1\"&gt;\u9032\u884c\u4e2d&lt;\/option&gt;\n                            &lt;option value=\"2\"&gt;\u5b8c\u4e86&lt;\/option&gt;\n                        &lt;\/select&gt;\n                        &lt;span asp-validation-for=\"Status\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n\n                &lt;div class=\"row\"&gt;\n                    &lt;div class=\"col-md-6 mb-3\"&gt;\n                        &lt;label asp-for=\"DueDate\" class=\"form-label\"&gt;\u671f\u9650&lt;\/label&gt;\n                        &lt;input asp-for=\"DueDate\" type=\"date\" class=\"form-control\" \/&gt;\n                        &lt;span asp-validation-for=\"DueDate\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                    &lt;\/div&gt;\n\n                    &lt;div class=\"col-md-6 mb-3\"&gt;\n                        &lt;label asp-for=\"ProjectId\" class=\"form-label\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8&lt;\/label&gt;\n                        &lt;select asp-for=\"ProjectId\" class=\"form-select\"&gt;\n                            &lt;option value=\"\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306a\u3057&lt;\/option&gt;\n                            @foreach (var project in ViewBag.Projects as List&lt;TaskManager.Models.Project&gt;)\n                            {\n                                &lt;option value=\"@project.Id\"&gt;@project.Name&lt;\/option&gt;\n                            }\n                        &lt;\/select&gt;\n                        &lt;span asp-validation-for=\"ProjectId\" class=\"text-danger\"&gt;&lt;\/span&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n\n                &lt;div class=\"mb-3\"&gt;\n                    &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;\n                        &lt;i class=\"bi bi-check-circle\"&gt;&lt;\/i&gt; \u4fdd\u5b58\n                    &lt;\/button&gt;\n                    &lt;a asp-action=\"Details\" asp-route-id=\"@Model.Id\" class=\"btn btn-secondary\"&gt;\n                        &lt;i class=\"bi bi-x-circle\"&gt;&lt;\/i&gt; \u30ad\u30e3\u30f3\u30bb\u30eb\n                    &lt;\/a&gt;\n                &lt;\/div&gt;\n            &lt;\/form&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n\n@section Scripts {\n    @{\n        await Html.RenderPartialAsync(\"_ValidationScriptsPartial\");\n    }\n}<\/code><\/pre>\n\n\n\n<p>5\u3064\u76ee\uff08\u6700\u5f8c\uff01\uff09: Delete.cshtml\uff08\u524a\u9664\u78ba\u8a8d\u753b\u9762\uff09\u3092\u4f5c\u6210<br>Views\/TaskItems \u30d5\u30a9\u30eb\u30c0\u3092\u53f3\u30af\u30ea\u30c3\u30af \u2192 \u8ffd\u52a0 \u2192 \u30d3\u30e5\u30fc \u2192 Razor\u30d3\u30e5\u30fc<br>\u540d\u524d\u3092\u300cDelete\u300d \u306b\u3057\u3066\u4f5c\u6210<br>\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@model TaskManager.Models.TaskItem\n\n@{\n    ViewData&#91;\"Title\"] = \"\u30bf\u30b9\u30af\u3092\u524a\u9664\";\n}\n\n&lt;div class=\"container mt-4\"&gt;\n    &lt;div class=\"row justify-content-center\"&gt;\n        &lt;div class=\"col-md-8\"&gt;\n            &lt;h1 class=\"text-danger\"&gt;@ViewData&#91;\"Title\"]&lt;\/h1&gt;\n            &lt;hr \/&gt;\n\n            &lt;div class=\"alert alert-warning\"&gt;\n                &lt;i class=\"bi bi-exclamation-triangle\"&gt;&lt;\/i&gt;\n                &lt;strong&gt;\u8b66\u544a:&lt;\/strong&gt; \u3053\u306e\u30bf\u30b9\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b\uff1f\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093\u3002\n            &lt;\/div&gt;\n\n            &lt;div class=\"card shadow-sm\"&gt;\n                &lt;div class=\"card-body\"&gt;\n                    &lt;h3 class=\"card-title mb-4\"&gt;@Html.DisplayFor(model =&gt; model.Title)&lt;\/h3&gt;\n\n                    &lt;dl class=\"row\"&gt;\n                        &lt;dt class=\"col-sm-3\"&gt;\u8aac\u660e&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (!string.IsNullOrEmpty(Model.Description))\n                            {\n                                &lt;p style=\"white-space: pre-wrap;\"&gt;@Model.Description&lt;\/p&gt;\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u8aac\u660e\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u512a\u5148\u5ea6&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @switch (Model.Priority)\n                            {\n                                case TaskManager.Models.TaskPriority.High:\n                                    &lt;span class=\"badge bg-danger\"&gt;\u9ad8\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskPriority.Medium:\n                                    &lt;span class=\"badge bg-warning text-dark\"&gt;\u4e2d\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskPriority.Low:\n                                    &lt;span class=\"badge bg-secondary\"&gt;\u4f4e\u512a\u5148\u5ea6&lt;\/span&gt;\n                                    break;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u30b9\u30c6\u30fc\u30bf\u30b9&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @switch (Model.Status)\n                            {\n                                case TaskManager.Models.TaskStatus.NotStarted:\n                                    &lt;span class=\"badge bg-light text-dark\"&gt;\u672a\u7740\u624b&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskStatus.InProgress:\n                                    &lt;span class=\"badge bg-info\"&gt;\u9032\u884c\u4e2d&lt;\/span&gt;\n                                    break;\n                                case TaskManager.Models.TaskStatus.Completed:\n                                    &lt;span class=\"badge bg-success\"&gt;\u5b8c\u4e86&lt;\/span&gt;\n                                    break;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u671f\u9650&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (Model.DueDate.HasValue)\n                            {\n                                &lt;i class=\"bi bi-calendar\"&gt;&lt;\/i&gt; \n                                @Model.DueDate.Value.ToLocalTime().ToString(\"yyyy\u5e74MM\u6708dd\u65e5\")\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u671f\u9650\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @if (Model.Project != null)\n                            {\n                                &lt;i class=\"bi bi-folder\"&gt;&lt;\/i&gt; \n                                @Model.Project.Name\n                            }\n                            else\n                            {\n                                &lt;span class=\"text-muted\"&gt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306a\u3057&lt;\/span&gt;\n                            }\n                        &lt;\/dd&gt;\n\n                        &lt;dt class=\"col-sm-3\"&gt;\u4f5c\u6210\u65e5\u6642&lt;\/dt&gt;\n                        &lt;dd class=\"col-sm-9\"&gt;\n                            @Model.CreatedAt.ToLocalTime().ToString(\"yyyy\u5e74MM\u6708dd\u65e5 HH:mm\")\n                        &lt;\/dd&gt;\n                    &lt;\/dl&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n\n            &lt;form asp-action=\"Delete\" method=\"post\" class=\"mt-3\"&gt;\n                &lt;input type=\"hidden\" asp-for=\"Id\" \/&gt;\n                &lt;button type=\"submit\" class=\"btn btn-danger\"&gt;\n                    &lt;i class=\"bi bi-trash\"&gt;&lt;\/i&gt; \u524a\u9664\u3059\u308b\n                &lt;\/button&gt;\n                &lt;a asp-action=\"Index\" class=\"btn btn-secondary\"&gt;\n                    &lt;i class=\"bi bi-x-circle\"&gt;&lt;\/i&gt; \u30ad\u30e3\u30f3\u30bb\u30eb\n                &lt;\/a&gt;\n            &lt;\/form&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"12\">\u4ed5\u4e0a\u3052<\/h2>\n\n\n\n<p>\u6700\u5f8c\u306b\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30e1\u30cb\u30e5\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059<br>Views\/Shared\/_Layout.cshtml\u306e\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306e\u90e8\u5206\u306b\u30bf\u30b9\u30af\u7ba1\u7406\u3078\u306e\u30ea\u30f3\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3059<br> _Layout.cshtml \u306e\u5168\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/&gt;\n    &lt;title&gt;@ViewData&#91;\"Title\"] - TaskManager&lt;\/title&gt;\n    &lt;link rel=\"stylesheet\" href=\"~\/lib\/bootstrap\/dist\/css\/bootstrap.min.css\" \/&gt;\n    &lt;link rel=\"stylesheet\" href=\"~\/css\/site.css\" asp-append-version=\"true\" \/&gt;\n    &lt;link rel=\"stylesheet\" href=\"~\/TaskManager.styles.css\" asp-append-version=\"true\" \/&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;header&gt;\n        &lt;nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\"&gt;\n            &lt;div class=\"container-fluid\"&gt;\n                &lt;a class=\"navbar-brand\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;TaskManager&lt;\/a&gt;\n                &lt;button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\"&gt;\n                    &lt;span class=\"navbar-toggler-icon\"&gt;&lt;\/span&gt;\n                &lt;\/button&gt;\n                &lt;div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\"&gt;\n                    &lt;ul class=\"navbar-nav flex-grow-1\"&gt;\n                        &lt;li class=\"nav-item\"&gt;\n                            &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\"&gt;\u30db\u30fc\u30e0&lt;\/a&gt;\n                        &lt;\/li&gt;\n                        &lt;li class=\"nav-item\"&gt;\n                            &lt;a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\"&gt;\u30d7\u30e9\u30a4\u30d0\u30b7\u30fc&lt;\/a&gt;\n                        &lt;\/li&gt;\n                        &lt;li class=\"nav-item\"&gt;\n                            &lt;a class=\"nav-link text-dark\" asp-controller=\"TaskItems\" asp-action=\"Index\"&gt;? \u30bf\u30b9\u30af\u7ba1\u7406&lt;\/a&gt;\n                        &lt;\/li&gt;\n                    &lt;\/ul&gt;\n                    &lt;partial name=\"_LoginPartial\" \/&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/nav&gt;\n    &lt;\/header&gt;\n    &lt;div class=\"container\"&gt;\n        &lt;main role=\"main\" class=\"pb-3\"&gt;\n            @RenderBody()\n        &lt;\/main&gt;\n    &lt;\/div&gt;\n\n    &lt;footer class=\"border-top footer text-muted\"&gt;\n        &lt;div class=\"container\"&gt;\n            &amp;copy; 2025 - TaskManager - &lt;a asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\"&gt;Privacy&lt;\/a&gt;\n        &lt;\/div&gt;\n    &lt;\/footer&gt;\n    &lt;script src=\"~\/lib\/jquery\/dist\/jquery.min.js\"&gt;&lt;\/script&gt;\n    &lt;script src=\"~\/lib\/bootstrap\/dist\/js\/bootstrap.bundle.min.js\"&gt;&lt;\/script&gt;\n    &lt;script src=\"~\/js\/site.js\" asp-append-version=\"true\"&gt;&lt;\/script&gt;\n    @await RenderSectionAsync(\"Scripts\", required: false)\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"13\">\u5b9f\u884c<\/h2>\n\n\n\n<p>\u3053\u308c\u3067\u4e00\u901a\u308a\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5b8c\u6210\u3057\u305f\u306e\u3067\u5b9f\u884c\u3057\u3066\u307f\u307e\u3059<br>\u7d50\u679c\u306f\u2026\u753b\u9762\u81ea\u4f53\u306f\u8868\u793a\u3055\u308c\u307e\u3057\u305f\u304c\u82f1\u8a9e\u8868\u8a18\u3067\u3071\u3063\u3068\u898b\u3067\u308f\u304b\u308a\u3065\u3089\u304b\u3063\u305f\u308a<br>\u4e00\u90e8\u30dc\u30bf\u30f3\u304c\u53cd\u5fdc\u3057\u306a\u304b\u3063\u305f\u308a\u3057\u305f\u306e\u3067\u4fee\u6b63\u3092\u52a0\u3048\u3066\u3044\u304d\u307e\u3059<br>\u4eca\u56de\u306f\u3053\u3053\u307e\u3067\u306b\u3057\u3066\u4fee\u6b63\u7de8\u306f\u6b21\u56de\u57f7\u7b46\u3057\u3066\u3044\u304d\u307e\u3059\u306e\u3067\u304a\u697d\u3057\u307f\u306b\uff01\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"\u76ee\u6b21 \u76ee\u6b21\u306f\u3058\u3081\u306b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210DB\u63a5\u7d9a\u6e96\u5099DB\u8a2d\u8a08PostgreSQL\u63a5\u7d9a\u6587\u5b57\u5217\u306e\u8a2d\u5b9aModel\u30af\u30e9\u30b9\u8ffd\u52a0DbContext\u4f5c\u6210\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f5c\u6210\u30d3\u30e5\u30fc\u306e\u4f5c\u6210\u4ed5\u4e0a\u3052\u5b9f\u884c \u306f\u3058\u3081\u306b \u4eca\u56de\u3082\u5f15\u304d\u7d9a\u304d\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5b66\u7fd2\u306e\u4e00\u74b0\u3068\u3057\u3066C#\u3067\u30a2\u30d7\u30ea\u4f5c\u6210\u3092\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002\u4eca\u56de\u4f5c\u6210\u3059\u308b\u306e\u306f\u300c\u30bf\u30b9\u30af\u7ba1\u7406\u30a2\u30d7\u30ea\u300d\u3067\u3059\u3002\u79c1\u81ea\u8eab\u3001\u30bf\u30b9\u30af\u7ba1\u7406\u304c\u82e6\u624b\u3067Google\u30ab\u30ec\u30f3\u30c0\u30fc\u306b\u4e88\u5b9a\u3092\u5165\u308c\u305f\u308a\u3001ToDo\u30ea\u30b9\u30c8\u306b\u66f8\u3044\u305f\u308a\u30e1\u30e2\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3057\u305f\u308a\u3001\u7d19\u306b\u8a18\u8f09\u3057\u305f\u308a\u3068\u8272\u3005\u8a66\u3057\u307e\u3057\u305f\u304c\u3069\u308c\u3082\u7d9a\u304b\u305a\u3057\u3063\u304f\u308a\u3053\u306a\u3044\u306e\u3067\u6298\u89d2\u3060\u304b\u3089\u52c9\u5f37\u304c\u3066\u3089\u81ea\u5206\u3067\u4f5c\u3063\u3066\u307f\u3088\u3046\u3068\u601d\u3044\u4eca\u56de\u4f5c\u6210\u3092\u6c7a\u610f\u3057\u307e\u3057\u305f\u3002 \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210 \u305d\u308c\u3067\u306f\u3053\u308c\u304b\u3089\u6bce\u5ea6\u306e\u3088\u3046\u306bVisual &hellip;","protected":false},"author":38,"featured_media":22257,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[180],"tags":[184],"class_list":{"0":"post-22113","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-c","8":"tag-season63"},"_links":{"self":[{"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/posts\/22113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/itport.cloud\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22113"}],"version-history":[{"count":12,"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/posts\/22113\/revisions"}],"predecessor-version":[{"id":22287,"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/posts\/22113\/revisions\/22287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itport.cloud\/index.php?rest_route=\/wp\/v2\/media\/22257"}],"wp:attachment":[{"href":"https:\/\/itport.cloud\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itport.cloud\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itport.cloud\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}