我在資料庫中有許多列是加密的。我可以使用 EF Core 6 從資料庫中提取記錄,我可以將記錄傳遞給解密例程,但我需要使用未加密的值更新記錄。
這是解密例程:
public Subject DecryptSubjects(Subject decryptSubject, List<string> EncryptedColumns)
{
if (decryptSubject == null)
{
return null;
}
var decryptedProperty = decryptSubject.GetType().GetProperty("Decrypted");
if (decryptedProperty != null)
{
bool? value = (bool?)decryptedProperty.GetValue(decryptSubject, null);
if (value != null)
{
if (value == true)
{
return decryptSubject;
}
}
}
foreach (string name in EncryptedColumns)
{
var property = decryptSubject.GetType().GetProperty(name);
if (property != null)
{
var value = property.GetValue(decryptSubject, null);
if (value != null)
{
property.SetValue(decryptSubject, Decrypt(value.ToString()), null);
}
}
}
if (decryptedProperty != null)
{
decryptedProperty.SetValue(decryptSubject, true, null);
}
return decryptSubject;
}
這很好地回傳了解密的值。
這是對該例程的呼叫:
var subjects = context.Subjects.ToList();
foreach (var subject in subjects)
{
// decrypt each subject and then update them in the database
var decryptedSubject = encrypt.DecryptSubjects(subject, subjectCols);
}
一旦我decryptedSubject回來,我想更新資料庫中的記錄。有沒有比將主題物件上的每個屬性設定為解密值更好的方法,decryptedSubject如下所示:
...
subject.FirstName = decrytpedSubject.FirstName;
subject.LastName = decrytedSubject.LastName;
...
uj5u.com熱心網友回復:
一種快速簡便的方法是使用 Automapper 設定映射器配置,CreateMap<Subject, Subject>()以及您絕對不希望被覆寫的欄位的任何排除項。從那里您可以使用很少記錄的.Map(decryptedSubject, subject)方法來復制值。
Update也可以作業,盡管您需要斷言 DbContext 尚未跟蹤同一記錄的實體。這意味著檢查context.Subjects.Local任何現有的跟蹤參考并分離它們,或者如果已經跟蹤了一個,則使用跨方法復制。Update否則,您將在通話中遇到例外。如果該參考作為較大操作的一部分被跟蹤,其中該參考與可能在此操作期間更新的另一個物體相關聯,則分離現有的跟蹤參考可能會產生負面影響。
Update也會覆寫一切。(包括 FK 和您可能不希望更改的其他內容)它還將為所有UPDATE列生成SQL 陳述句,無論任何值是否發生更改,其中使用 Automapper或手動復制方法只會生成并執行陳述句實際更改的值(如果有任何值實際更改)。這也不會添加驗證以確保您打算更新的記錄確實存在于資料庫中,其中加載現有物體并使用或手動復制值確實預先斷言實際上存在要更新的物體而不是失敗如果這是更大操作的一部分,則可能會發生這種情況。MapUPDATEMap()SaveChanges()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441672.html
上一篇:Blazor服務器:“System.InvalidOperationException:在前一個操作完成之前在此背景關系上啟動了第二個操作”
下一篇:按具有布爾屬性的物件屬性過濾
