ฉันดิ้นรนมาระยะหนึ่งแล้วกับปัญหาที่ประกอบด้วยการตรวจสอบเอนทิตีฐานข้อมูลทั่วไปเมื่อบันทึกแล้ว ฉันมีโปรเจ็กต์ที่ใช้ EF 6 และจำเป็นต้องสร้างวิธีการ "ไม่รุกราน" เพื่อตรวจสอบเอนทิตีเมื่อมีการเพิ่ม แก้ไข หรือลบ ฉันต้องจัดเก็บ JSON ของเอนทิตีที่แทรก เอนทิตีที่แก้ไข หรือเอนทิตีที่ถูกลบ โดยไม่รบกวนโฟลว์ปกติ โครงการนี้มีการใช้งาน Database First
วิธีแก้ปัญหาของฉันนั้นง่ายมาก เพิ่มคลาสบางส่วนของเอนทิตีใด ๆ ที่โปรแกรมเมอร์ที่เหลือต้องการตรวจสอบการใช้งาน IAudit ซึ่งโดยพื้นฐานแล้วเป็นอินเทอร์เฟซว่างเปล่าเพื่อรับการเปลี่ยนแปลงทั้งหมดจากเอนทิตีที่ใช้งานมัน
public interface IAudit {}
ฉันมีเอนทิตีสกุลเงินที่เพิ่งใช้งานโดยไม่ต้องใช้รหัสอื่น (ฉันสามารถทำอะไรอย่างอื่นได้ในอนาคต แต่ฉันไม่ต้องการมัน)
public partial class Currencies : IAudit
ฉันแทนที่วิธีการ SaveChanges เพื่อค้นหาเอนทิตีที่จะตรวจสอบ
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();
}
โซลูชันจะเรียก CreateAuditLog ถึง 3 เท่า เนื่องจากในอนาคตอันใกล้นี้ ฉันจำเป็นต้องใช้การกำหนดค่าเพื่อตรวจสอบสิ่งที่ผู้ใช้ตัดสินใจ อาจมาจากการกำหนดค่าฐานข้อมูลที่ผู้ใช้เปิดใช้งาน/ปิดใช้งาน
ทุกอย่างทำงานได้อย่างสมบูรณ์แบบ ฉันสามารถบันทึกเอนทิตีในสถานะที่ระบุได้:
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
}
}
ปัญหาคือฉันสูญเสียทุกค่าในสถานะ Deleted ฉันรับเฉพาะ ID เท่านั้น ไม่มีข้อมูลในคุณสมบัติยกเว้น ID และไม่มีความเป็นไปได้ใด ๆ ที่จะแยกมันออกมาในทางใดทางหนึ่ง ฉันมองหาโซลูชันทุกรายการใน StackOverflow และเว็บไซต์อื่นๆ และไม่มีอะไรที่จะกู้คืนข้อมูลต้นฉบับได้ ฉันจะรับค่าที่ถูกลบก่อนหน้านี้เพื่อจัดเก็บในลักษณะเดียวกับที่ฉันจัดเก็บเอนทิตีที่เพิ่มและแก้ไขได้อย่างไร