Saya telah berjuang selama beberapa waktu dengan masalah yang terdiri dari audit entitas basis data secara umum ketika mereka disimpan. Saya memiliki proyek yang menggunakan EF 6 dan saya diharuskan membuat metode "non-invasif" untuk mengaudit entitas ketika ditambahkan, dimodifikasi, atau dihapus. Saya harus menyimpan JSON dari entitas yang dimasukkan, entitas yang dimodifikasi, atau entitas yang dihapus tanpa mengganggu aliran normal. Proyek ini memiliki implementasi Database First.
Solusi saya sederhana, tambahkan sebagian kelas entitas apa pun yang ingin diaudit oleh pemrogram lainnya dengan penerapan IAudit yang pada dasarnya merupakan antarmuka kosong untuk mendapatkan semua perubahan dari entitas yang mengimplementasikannya.
public interface IAudit {}
Saya memiliki entitas Mata Uang yang hanya mengimplementasikannya tanpa kode lain (saya dapat melakukan hal lain di masa mendatang tetapi saya tidak memerlukannya)
public partial class Currencies : IAudit
Saya mengganti metode SaveChanges untuk mencari entitas yang akan diaudit
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
// This linq looks for new entities that were marked for audit
CreateAuditLog(System.Data.Entity.EntityState.Added);
CreateAuditLog(System.Data.Entity.EntityState.Modified);
CreateAuditLog(System.Data.Entity.EntityState.Deleted);
return base.SaveChanges();
}
Solusinya memanggil 3 kali CreateAuditLog karena dalam waktu dekat saya perlu menerapkan konfigurasi untuk mengaudit apa pun yang diputuskan pengguna, mungkin dari konfigurasi database yang diaktifkan/dinonaktifkan oleh pengguna.
Semuanya bekerja dengan sempurna, saya bisa mendapatkan entitas yang disimpan dalam keadaan yang ditentukan:
private void CreateAuditLog(System.Data.Entity.EntityState state)
{
var auditedEntities = ChangeTracker.Entries<IAudit>()
.Where(p => p.State == state)
.Select(p => p.Entity);
... some code that do something else
foreach (var auditedEntity in auditedEntities)
{
... some information I required to add
strJSON = JsonConvert.SerializeObject(auditedEntity, new EFNavigationPropertyConverter());
... some code to save audit information
}
}
Masalahnya adalah saya kehilangan setiap nilai dalam keadaan Dihapus, saya hanya mendapatkan ID, tidak ada informasi di properti kecuali ID dan tidak ada kemungkinan untuk mengekstraknya dengan cara apa pun. Saya mencari setiap solusi di StackOverflow dan situs web lain dan tidak ada yang dapat memulihkan informasi asli. Bagaimana saya bisa mendapatkan nilai yang dihapus sebelumnya untuk menyimpannya dengan cara yang sama seperti saya menyimpan entitas yang Ditambahkan dan Dimodifikasi?