मैं एक आधार वर्ग कि मुझे लगता है कि से विरासत है दो शून्य अन्य संस्थाओं के साथ कई रिश्तों को:ChangeTracker इकाई की रूपरेखा 4.1 - संबंधित के मूल मान ऑब्जेक्ट्स
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; }
}
मैं कठिनाई इन के लिए मूल मूल्यों हो रही हो रहा है रिश्ते (संबंधित वेबब्रेजेस & संबंधितटैग) SaveChanges के दौरान चेंजट्रैकर का उपयोग करते हुए इकाइयों को देखते समय। मैं पहले और बाद में सभी स्केलर मान देख सकता हूं, और मैं नए रिश्तों को देख सकता हूं, लेकिन मैं पुराने लोगों को नहीं देख सकता। मैंने सदस्य और संग्रह विधियों का उपयोग करने का प्रयास किया है, लेकिन वे केवल मुझे वर्तमान मूल्य दिखाते हैं; पुराना नहीं इसके अलावा मुझे उन लोगों का उपयोग करना पसंद नहीं है क्योंकि मुझे नेविगेशन संपत्ति का नाम जानना आवश्यक है, जो पर्याप्त सामान्य नहीं है।
मैं उन संबंधित वस्तुओं को ढूंढ सकता हूं जिनके रिश्ते को बदला जा रहा है, लेकिन निश्चित रूप से उन संबंधित वस्तुओं के मूल्यों में बदलाव नहीं हो रहा है, इसलिए यह कोई मदद नहीं है।
क्या चेंजट्रैकर के साथ SaveChanges के दौरान किसी इकाई के पिछले संबंधों को ट्रैक करने के लिए मेरे लिए कुछ साफ तरीका है?
नीचे है कि मैं पर काम कर रहा हूँ कोड की धारा है:
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();
}
संबंधित ऑब्जेक्ट्स को ऑब्जेक्टस्टेट प्रबंधक द्वारा ट्रैक किया जा रहा है और आप अपनी ऑब्जेक्ट स्टेट प्रविष्टियों को प्राप्त करने में सक्षम होना चाहिए जैसे कि आप इसे अपने मुख्य ऑब्जेक्ट के लिए कैसे प्राप्त करते हैं। यदि आप उस कोड को पोस्ट करते हैं जिसके साथ आप संघर्ष कर रहे हैं, तो मैं मदद कर सकता हूं। –
धन्यवाद फिर से मोर्टेज़ा ... मैंने कोड के अनुभाग को पोस्ट किया है कि मैं अभी इस समय काम कर रहा हूं - कृपया इसकी ढीलीता से क्षमा करें; इसे बिल्कुल भी ठीक नहीं किया गया है - बस इसे काम करने की कोशिश कर रहा है। मैं आइटम्समेबल स्ट्रिंग्स का उपयोग कर किसी भी समस्या के बिना ऑब्जेक्ट्स के स्केलर गुण प्राप्त कर सकता हूं: entity.OriginalValues.PropertyNames & entity.CurrentValues.PropertyNames। मुझे इकाई के साथ परेशानी हो रही है। चयन() और इकाई। मेम्बर()। जो मैं पूरा करने की कोशिश कर रहा हूं उसके लिए उपयोग किया जाना चाहिए? क्या इस सामान्य को बनाने का कोई तरीका है ताकि मुझे संग्रह नामों को कड़ी-कोड करने की आवश्यकता न हो? प्रतिबिंब शायद? – DMC
मैं कल तक इसे आजमाने की स्थिति में नहीं हूं ... क्या आप में से कोई भी जानता है कि मैं दो उत्तरों के बीच अंक कैसे विभाजित कर सकता हूं? क्योंकि मुझे लगता है कि आप दोनों ने बहुत मूल्यवान जानकारी दी है। – DMC