Tôi có một lớp cơ sở mà tôi kế thừa từ đó có hai số không đến nhiều mối quan hệ với các đơn vị khác:ChangeTracker Entity Framework 4.1 - Giá trị gốc của Related Objects
public abstract class WebObject
{
public WebObject()
{
RelatedTags = new List<Tag>();
RelatedWebObjects = new List<WebObject>();
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string MetaKeywords { get; set; }
public string MetaDescription { get; set; }
[InverseProperty("WebObjects")]
public virtual WebSite WebSite { get; set; }
[Required(ErrorMessage = "Every WebObject must be associated with a WebSite.")]
public Guid WebSiteId { get; set; }
public virtual ICollection<Tag> RelatedTags { get; set; }
public IList<Guid> RelatedTagIds { get; set; }
public virtual ICollection<WebObject> RelatedWebObjects { get; set; }
public IList<Guid> RelatedWebObjectIds { get; set; }
}
Tôi gặp khó khăn khi các giá trị ban đầu cho các mối quan hệ (RelatedWebObjects & RelatedTags) khi xem xét các thực thể bằng cách sử dụng ChangeTracker trong SaveChanges. Tôi có thể thấy tất cả các giá trị vô hướng trước và sau, và tôi có thể thấy các mối quan hệ mới, nhưng tôi không thể nhìn thấy các giá trị cũ. Tôi đã thử sử dụng các phương pháp Thành viên và Bộ sưu tập, nhưng chúng chỉ hiển thị cho tôi các giá trị hiện tại; không phải là cũ. Ngoài ra tôi không thích sử dụng chúng bởi vì nó đòi hỏi tôi phải biết tên của thuộc tính điều hướng, không đủ chung chung.
Tôi có thể tìm thấy các đối tượng liên quan có mối quan hệ đang thay đổi, nhưng tất nhiên giá trị trong các đối tượng liên quan đó không thay đổi, do đó cũng không phải là bất kỳ trợ giúp nào.
Có cách nào sạch sẽ để tôi theo dõi các mối quan hệ trước đó của một thực thể trong SaveChanges bằng ChangeTracker không?
Dưới đây là phần mã mà tôi đang làm việc trên:
public override int SaveChanges()
{
List<AuditObject> auditTrailList = new List<AuditObject>();
foreach (DbEntityEntry entity in ChangeTracker.Entries().Where(obj => { return obj.State == EntityState.Added || obj.State == EntityState.Modified || obj.State == EntityState.Deleted; }))
{
if (!(entity.Entity is AuditObject))
{
AuditObject auditObject = new AuditObject();
auditObject.Id = Guid.NewGuid();
auditObject.RevisionStamp = DateTime.Now;
auditObject.UserName = HttpContext.Current.User.Identity.Name;
auditObject.EntityType = Utilities.GetCleanClassNameIfProxyClass(entity.Entity.GetType().Name);
if (entity.State == EntityState.Added)
auditObject.Action = EntityState.Added.ToString();
else if (entity.State == EntityState.Modified)
auditObject.Action = EntityState.Modified.ToString();
else if (entity.State == EntityState.Deleted)
auditObject.Action = EntityState.Deleted.ToString();
DbMemberEntry t1 = entity.Member("RelatedWebObjects");
// cannot find original relationship collection...
DbCollectionEntry t2 = entity.Collection("RelatedWebObjects");
// cannot find original relationship collection...
if (entity.State == EntityState.Added || entity.State == EntityState.Modified)
{
XDocument currentValues = new XDocument(new XElement(auditObject.EntityType));
foreach (string propertyName in entity.CurrentValues.PropertyNames)
{
currentValues.Root.Add(new XElement(propertyName, entity.CurrentValues[propertyName]));
}
auditObject.NewData = Regex.Replace(currentValues.ToString(), @"\r\n+", " ");
}
if (entity.State == EntityState.Modified || entity.State == EntityState.Deleted)
{
XDocument originalValues = new XDocument(new XElement(auditObject.EntityType));
foreach (string propertyName in entity.OriginalValues.PropertyNames)
{
originalValues.Root.Add(new XElement(propertyName, entity.OriginalValues[propertyName]));
}
auditObject.OldData = Regex.Replace(originalValues.ToString(), @"\r\n+", " ");
}
auditTrailList.Add(auditObject);
}
}
foreach (var audit in auditTrailList)
this.AuditObjects.Add(audit);
return base.SaveChanges();
}
Các đối tượng liên quan cũng đang được thay đổi do ObjectStateManager theo dõi và bạn sẽ có thể nhận được các mục nhập trạng thái đối tượng giống như cách bạn nhận được đối tượng chính của mình. Nếu bạn đăng mã mà bạn đang gặp khó khăn, tôi có thể giúp bạn. –
Cảm ơn một lần nữa Morteza ... Tôi đã đăng phần mã mà tôi đang làm việc với ngay bây giờ - hãy tha thứ cho sự cẩu thả của nó; nó chưa được tái cấu trúc - chỉ cố gắng làm cho nó hoạt động. Tôi có thể nhận được các thuộc tính vô hướng của các đối tượng mà không gặp bất kỳ vấn đề nào bằng cách sử dụng các chuỗi IEnumerable: entity.OriginalValues.PropertyNames & entity.CurrentValues.PropertyNames. Tôi gặp sự cố với entity.Collection() và entity.Member(). Nên sử dụng cái nào cho những gì tôi đang cố gắng hoàn thành? Có cách nào để làm cho điều này chung chung để tôi không phải mã hóa cứng tên bộ sưu tập? Phản ánh có thể? – DMC
Tôi không ở vị trí nào để thử điều này cho đến ngày mai ... một trong hai bạn có biết cách tôi có thể chia điểm giữa hai câu trả lời không? bởi vì tôi nghĩ rằng cả hai đều cung cấp thông tin rất có giá trị. – DMC