你能告訴我是否可以從使用 EF Core 編輯記錄中排除某些列。背景關系:我有一個表,其中有一個存盤為位元組陣列的檔案,但是在編輯記錄時,我得到了空值,我想通過對資料庫進行額外查詢來解決這個問題,在那里我使用舊欄位并插入它進入編輯過的,但在我看來這是一個笨拙的解決方案。我將補充說:您仍然需要在某一天編輯該欄位,但不適用于典型的編輯。
public async Task<IActionResult> Edit(int id, [Bind("id,Name,Price,Minimum_Pages,Requirements,Responsible,Start_Registration,Start_Conference,ResponsibleID,File,File_Name,File_Descriptor,Priority")] Registry_Conference registry_Conference)
{
if (id != registry_Conference.id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(registry_Conference);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!Registry_ConferenceExists(registry_Conference.id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View("~/Views/NPR_Module/Registry/Registry_Conference/Edit.cshtml", registry_Conference);
}
uj5u.com熱心網友回復:
您示例中的“拐杖”期望傳入的值是一個物體。它是使用 Entity 型別宣告的,但它不是一個物體,甚至不是一個分離的物體。它是一些反序列化的 JSON,看起來像一個物體。
當您呼叫 時Update,EF 需要一個完整的、分離的物體。你不能提供它,所以簡單的答案是你不能Update可靠地用作獲得所需資料的拐杖。當你給它反序列化的 JSON 時,物體相似物件將只包含傳遞到呼叫中的資料。對于非常簡單的物件,您可以在其中將所有內容傳入和傳出客戶端,您可以避免這樣做,但這確實會帶來意外篡改資料的風險,否則您不希望更改資料。
完成您需要的最簡單方法是使用 Automapper。最基本的:
var mapper = new MapperConfiguration(cfg => {
cfg.CreateMap<Registry_Conference, Registry_Conference>()
.ForMemeber(x => x.FileData, opt => opt.Ignore())
// Add any other properties that should not be copied...
}).CreateMapper();
var dataRegistryConference = _context.Registry_Conferences.Single(x => x.Id == registry_Conference.Id);
// TODO: Check Row Version here.
// As well as other validations.
mapper.Map(registry_Conference, dataRegistryConference);
_context.SaveChanges();
或者,您可以手動將允許的值從傳入的資料復制到實時資料。反對這種方法的典型問題/爭論是“我想避免對資料庫的額外呼叫”。對此的簡單答案是您真的不想,或者至少有很好的理由檢查資料庫。
的// Check Row Version是,如果你只跟蹤行修改跟蹤行版本戳。如果其他人修改了該行,這可以幫助防止陳舊資料覆寫,因為傳回修改過的物件的呼叫者已經獲取了他們基于更改的資料副本。您應該進行的其他檢查包括所有權/權限等。您的方法最終會傳遞一個您應該確保存在的 ID,處理陳舊資料,并驗證當前用戶是否可以并且應該被允許在其當前狀態下更新它。(即此用戶是否有權查看/編輯它?資料是否處于允許編輯的狀態?等)為此,您應該始終檢查現有資料狀態作為真??實來源,永遠不要相信傳入的內容。
使用 Automapper 或手動復制的另一個好處Update是,EF 只會UPDATE在任何值實際更改時生成SQL 陳述句,并且僅針對更改的值。使用Update將為所有列執行UPDATESQL,無論它們是否更改,更新行版本和觸發觸發器等。
更好的是避免將傳入的資料屏蔽為物體,并宣告一個僅包含應該被編輯的資料的視圖模型。這樣您就不需要Ignore()在映射器中配置任何設定。如果以后您有可以接受物體的通用代碼并且您想從這樣的地方呼叫該代碼,它也可以避免混淆。接受物體的代碼應始終獲得完整或可完整的物體,其中此方法僅提供物體的不完整外殼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/392051.html
