Tôi đang viết một đường mòn kiểm tra từ các đoạn mã được tìm thấy trực tuyến. Trong khi gọi hàm SaveChanges, tôi lặp lại tất cả các thực thể đã sửa đổi đã đăng ký với Context và xây dựng các mục nhật ký từ các thay đổi của chúng.DbEntityEntry.OriginalValues không điền các thuộc tính phức tạp
foreach (DbEntityEntry modifiedEntity 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 changed record, get the audit record entries and add them
foreach(AuditLog x in GetAuditRecordsForChange(modifiedEntity, userId))
{
this.AuditLog.Add(x);
}
}
Khi tôi sau đó cố gắng truy cập vào các giá trị ban đầu của đơn vị sửa đổi, tất cả các thuộc tính vô hướng được dân cư nhưng những cái phức tạp không tồn tại (số bất động sản sẽ được nói 6 thay vì 8). Sau đó tôi gọi ToObject()
để xây dựng đối tượng ở trạng thái ban đầu của nó nhưng rõ ràng các thuộc tính phức tạp là tất cả các giá trị rỗng.
modifiedEntity.OriginalValues.ToObject()
này chỉ xảy ra với một số của các đối tượng tên miền của tôi, và những đối tượng luôn hiển thị như các proxy sau khi ToObject()
cuộc gọi trong khi (tôi không chắc chắn lý do tại sao) nhưng những người mà không có proxy tạo ra cho chúng theo thực thể, các thuộc tính phức tạp của chúng cư trú tốt. Khi tôi sử dụng các proxy POCO như bình thường trong suốt ứng dụng của tôi, tải chậm hoạt động tốt trên chúng.
Tôi nhận thấy rằng nếu tôi thực hiện thay đổi đối với một trong những thuộc tính phức tạp này không được điền như một phần của dữ liệu OriginalValues, trạng thái của đối tượng sẽ không bị thay đổi thành Đã sửa đổi, điều này có ý nghĩa như theo dõi thay đổi so sánh giá trị ban đầu đến hiện tại để xem liệu giá trị đó có thay đổi hay không. Điều gì không có ý nghĩa là dữ liệu vẫn còn tồn tại trên SaveChanged ??
EDIT: Tôi vừa nhận thấy, đối tượng mô hình hiện điền các thuộc tính phức tạp của nó, thuộc tính phức tạp được đề cập (theo quy ước) được coi là 'loại phức' của Thực thể không có khóa chính.
Bất kỳ ý tưởng nào?
Tôi không chắc chắn làm thế nào tôi có thể xây dựng một đường mòn kiểm toán hiệu quả nếu đây là trường hợp. Nếu tôi sửa đổi một thuộc tính phức tạp của một thực thể abitrary tức là 'myVehicle.Colour = myRepo.GetModelById (4)' thì thực thể myVehicle không có trạng thái được thiết lập là MODIFIED. Phải có cách để tìm sự thay đổi này. Tôi đặt câu hỏi về việc sử dụng myEntity.OriginalValues.ToObject() nếu nó xây dựng một đối tượng chỉ với các giá trị vô hướng được điền. Tôi đang thiếu gì? –
SeeNoWeevil
Sau một chút đào, có vẻ như những gì tôi đang đề cập đến là theo dõi mối quan hệ, tức là nếu tôi cập nhật tham chiếu trong một thuộc tính của đối tượng cha mẹ của tôi với một đối tượng con khác. Giả sử thuộc tính này trỏ đến một loại thực tế có ID và không phải là 'loại phức tạp' ID, đây là thay đổi _relationship_ và không phải là thay đổi thuộc tính thông thường. Cách duy nhất tôi có thể truy cập vào những thay đổi quan hệ này là thông qua myObjectContext.ObjectStateManager.GetObjectStateEntries (..) Không chắc chắn cách tôi báo cáo chúng hiệu quả như nhật ký kiểm tra. – SeeNoWeevil