iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
SideProject30

我想自己刻部落格系列 第 24

資料匯入時注意細節

  • 分享至 

  • xImage
  •  

昨天資料匯入程式匯入時有遇到一點問題,程式有稍微調整一下,還是講一下。實際程式碼以 GitHub 上為主。

在程式這邊,跟新部落格的資料庫,都是不可以為 NULL。

但是我的 Wordpress 資料中,在 post_date_gmtpost_modified_gmt 中有出現 NULL 資料。 這個資料在 CSV 中,是以 NULL 文字呈現。

就算指定欄位對應物件 ImportPost 型別的型別為 DateTime? 也會失敗。

實際上可以看 CsvHelper 的文件,看要怎麼調整設定。

我大概試了五分鐘後,就果斷放棄。這兩個欄位的資料,我沒有要使用,只接忽略就好。

Post.Partial.cs

Post.cs 是我們用 EF Core 反射工程產生的物件,產生的物件是 partial class

https://ithelp.ithome.com.tw/upload/images/20231009/201204206BYZ0oZONv.png

所以若我們想對 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;
    }
}

匯入 Controller

匯入的功能,預想是初次使用時,才要資料匯入,所以這邊定義了一個 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 上為主。


上一篇
實作 Wordprss 資料匯入功能 - ImportService
下一篇
建立 sitemap.xml
系列文
我想自己刻部落格31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言