相同

[Blazor] EF Core 新增資料時使用了上一筆資料?!

作者:

分類:

在 EF Core 的 User Model 長這樣:

C#
public partial class User
{
  public int Sn { get; set; }
  public virtual UserDetail? UserDetail { get; set; }
}

在 UserDetail 儲存了 User 個人資料。

資料是使用者姓名及身分證號,
在匯入的 Excel 檔第 1 筆照格式填入,第 2 筆故意將身分證加到12碼使系統報錯。

到匯入頁面連續匯入了兩次這個資料檔;第一次是正確的結果,一筆可匯入另一筆因資料超過長度而由 DB 報錯不能匯入;
接著再重新匯入同樣的資料檔,這次全部都出現了「資料超過長度」的錯誤,但是只要「F5 重新整理」頁面就沒有這樣問題。

在 Debug 模式觀察,資料都有確實的取得及設定在更新的 Entity 上,但就是在

C#
await DbContext.SaveChangesAsync();

時出錯:第二次匯入第 1 筆資料時,身分證號卻帶入了第 2 筆的12碼身分證,也就是「第 1 筆的 User 帶了上次匯入時第 2 筆的 UserDetail」!!

將原程式寫法改為「新增前全新 New 出 Entity 物件」,但仍然無效,
Google 到與我相似問題的 stackoverflow文章
嘗試用了「_context.Entry(User).State = EntityState.Detached;」但卻無法找到 EntityState 的命名空間,
雖然感覺這篇文章有解,但還是覺得不是理想解法,放棄!

回到系統本身…
在 Blazor 是以 Factory 模式建立 DbContext ,使用時再將 DbContextFactory 注入到要使用的 Class;建立起的 DbContext 生命周期預設是 Scoped。
嗯嗯…看來這就是問題所在了。

應該是 Blazor 將兩次連續的檔案匯入操作視為一個 Request,EF Core 是 Scoped 共用了第一次匯入的 DbContext 。
雖然不確定這樣的理解是否 100% 正確,但是我可以確定替「新增資料」新建一個 DbContext 一定是正解!
係滴!透過 Factory 再建一個 DbContext 就解決了!

C#
var newContext = _dbFactory.CreateDbContext();

接下來的新增及更新,都使用 newContext 就 OK。


哇哇哇,又噴了我 3 個小時~~

最後更新日期:2025-03-01

Views: 1

Views: 1


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *