昨天資料匯入程式匯入時有遇到一點問題,程式有稍微調整一下,還是講一下。實際程式碼以 GitHub 上為主。
在程式這邊,跟新部落格的資料庫,都是不可以為 NULL。
但是我的 Wordpress 資料中,在 post_date_gmt
與 post_modified_gmt
中有出現 NULL
資料。 這個資料在 CSV 中,是以 NULL 文字呈現。
就算指定欄位對應物件 ImportPost
型別的型別為 DateTime?
也會失敗。
實際上可以看 CsvHelper 的文件,看要怎麼調整設定。
我大概試了五分鐘後,就果斷放棄。這兩個欄位的資料,我沒有要使用,只接忽略就好。
Post.cs 是我們用 EF Core 反射工程產生的物件,產生的物件是 partial class
所以若我們想對 Post.cs 做額外擴充,可以另外定義個同名 partial class 在其他檔案,編譯的時候會合併起來。
因為產生的物件有最上方有表示 #nullable disable
關閉檢查。但是實際寫入到資料庫的欄位,是定義不可為 Null
這邊定義一個 NewPost 靜態方法,以確保產生新的 Post 內都有預設值。
Post.Partial.cs
public partial class Post
{
public static Post NewPost()
{
var newPost = new Post();
newPost.Id = 0;
newPost.Title = string.Empty;
newPost.Content = string.Empty;
newPost.FilteredContent = string.Empty;
newPost.UpdateDate = new DateTime();
newPost.PublishDate = new DateTime();
newPost.Path = string.Empty;
newPost.Status = string.Empty;
newPost.OgDescription = string.Empty;
newPost.OgTitle = string.Empty;
newPost.OgKeywords = string.Empty;
newPost.OgImage = string.Empty;
return newPost;
}
}
匯入的功能,預想是初次使用時,才要資料匯入,所以這邊定義了一個 InitController 來使用我們剛剛寫的 ImportService
(一定要記得去 Program.cs DI註冊)
builder.Services.AddTransient<IImportService, ImportService>();
Controller Action 這邊只要負責檔案上傳就好。剩下就交給 Service 就可以了。
public class InitController : Controller
{
private readonly IImportService _importService;
public InitController(IImportService importService)
{
_importService = importService;
}
public IActionResult Import()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Import(IFormFile file)
{
await _importService.StartAsync(file);
return RedirectToAction("Index", "Home");
}
}
View 內的 Form 表單要設定 multipart/form-data
才能檔案上傳
<form asp-action="Import" enctype="multipart/form-data">
<div asp-validation-summary="ModelOnly" class=""></div>
<input type="file" id="file" name="file" required />
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
實際程式碼以 GitHub 上為主。