Tôi cố gắng để thực hiện một AuditLog sử dụng EF 4.1, bằng cách ghi đè các SaveChanges() phương pháp như đã trình bày ở các vị trí sau:Entity Framework DbContext SaveChanges() OriginalValue sai
- http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/
- Entity Framework 4.1 DbContext Override SaveChanges to Audit Property Change
Tôi đang gặp sự cố với mục nhập "đã sửa đổi". Bất cứ khi nào tôi cố gắng truy cập vào số OriginalValue của thuộc tính được đề cập, giá trị này luôn có giá trị giống như trong trường CurrentValue.
đầu tiên tôi sử dụng mã này, và nó xác định thành công mục dữ liệu nào được sửa đổi:
public int SaveChanges(string userID)
{
// Have tried both with and without the following line, and received same results:
// ChangeTracker.DetectChanges();
foreach (
var ent in this.ChangeTracker
.Entries()
.Where(p => p.State == System.Data.EntityState.Added
p.State == System.Data.EntityState.Deleted
p.State == System.Data.EntityState.Modified))
{
// For each change record, get the audit record entries and add them
foreach (AuditLog log in GetAuditRecordsForChange(ent, userID))
{
this.AuditLog.Add(log);
}
}
return base.SaveChanges();
}
Vấn đề là trong này (mã viết tắt):
private List<AuditLog> GetAuditRecordsForChange(DbEntityEntry dbEntry, string userID)
{
if (dbEntry.State == System.Data.EntityState.Modified)
{
foreach (string propertyName in dbEntry.OriginalValues.PropertyNames)
{
if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName),
dbEntry.CurrentValues.GetValue<object>(propertyName)))
{
// It never makes it into this if block, even when
// the property has been updated.
}
// If I updated the property "Name" which was originally "OldName" to the value "NewName" and then break here and inspect the values by calling:
// ?dbEntry.OriginalValues.GetValue<object>("Name").ToString()
// the result will be "NewName" and not "OldName" as expected
}
}
}
Điều kỳ lạ là các hãy gọi tới số dbEntry.Property(propertyName).IsModified();
sẽ trả lại đúng trong trường hợp này. Nó chỉ là OriginalValue không có giá trị kỳ vọng bên trong. Có ai sẵn lòng giúp tôi đi đúng hướng không? Tôi dường như không thể làm điều này để hoạt động chính xác.
Bạn truy vấn các thực thể của mình như thế nào và sau đó thay đổi các giá trị thuộc tính? Nếu bạn về cơ bản gắn thực thể và sau đó thiết lập trạng thái để sửa đổi, sau đó các giá trị ban đầu sẽ bị mất. Để giữ các giá trị ban đầu, bạn cần phải theo dõi EF thực thể tất cả các cách từ truy vấn cho đến khi lưu, hoặc bạn cần phải theo dõi các giá trị ban đầu trong mã của riêng bạn. –
Xin lỗi - Tôi đã cố gắng đăng một số mã trong các nhận xét nhưng nó không hoạt động tốt.Tôi đang sử dụng một hành động [HttpPost] của một bộ điều khiển MVC. Điều này gọi phương thức "SaveProduct" của kho lưu trữ sản phẩm của tôi. Trong kho lưu trữ có vẻ như tôi thực sự gọi 'context.Entry (sản phẩm) .State = EntityState.Modified' và sau đó tôi SaveChanges trên ngữ cảnh. Bạn có thể chỉ cho tôi bất kỳ tài nguyên nào thể hiện hai kỹ thuật bạn đã đề cập không? Hoặc ít nhất là cho tôi một vài gợi ý? –
Tôi _think_ trong MVC cách được khuyến nghị để làm điều này sẽ là với các trường ẩn. Về cơ bản bạn sẽ lưu các giá trị ban đầu mà bạn quan tâm vào các trường ẩn và sau đó đọc lại chúng trong POST của bạn. Tôi không biết thực hành tốt nhất xung quanh điều này hoặc nếu có một sự trừu tượng MVC để giúp đỡ. –