2011-01-13 12 views
5

मैं अपने ईएफ 4 (मॉडल पहले) एप्लिकेशन में ऑडिटिंग जोड़ने की प्रक्रिया में हूं। मैं उन परिवर्तनों पर संरचनात्मक गुणों के बारे में विवरण प्राप्त कर सकता हूं जिनमें परिवर्तन हैं। मैं यह भी देख सकता हूं कि कई रिश्तों में कई बदलाव हुए हैं। मैं शामिल प्रकारों का नाम देख सकता हूं और क्या हुआ (जोड़ें या हटाएं) लेकिन मुझे वास्तव में क्या पसंद आएगा, यह संबंध है कि संबंधों में शामिल इकाइयों की आईडी है।ईएफ 4 ऑडिट कई रिश्तों में कई लोगों के परिवर्तन

यहाँ मैं वर्तमान में कई रिश्तों के लिए कई करने के लिए ट्रैकिंग परिवर्तन के लिए है:

var changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified); 
var auditTime = DateTime.Now; 

foreach (var change in changes) 
{ 
    if (change.Entity != null && change.Entity.GetType().Equals(typeof(AuditTrail))) 
    { 
     continue; 
    } 

    var detailsBuilder = new StringBuilder(); 

    if (change.Entity == null & (change.State == EntityState.Added | change.State == EntityState.Deleted)) 
    { 
     detailsBuilder.Append("A link between entities "); 
     foreach (var changedMember in change.EntitySet.ElementType.KeyMembers) 
     { 
      detailsBuilder.AppendFormat("{0}", changedMember.Name); 
      if(change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) < change.EntitySet.ElementType.KeyMembers.Count -2) 
      { 
       detailsBuilder.Append(", "); 
      } 
      else if (change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) == change.EntitySet.ElementType.KeyMembers.Count - 2) 
      { 
       detailsBuilder.Append(" and "); 
      } 
     } 

     detailsBuilder.AppendFormat(" was {0}.<br />", change.State); 
    } 
} 

मैं विवरण (या यहां तक ​​कि वास्तविक संस्थाओं) संबंध परिवर्तन में शामिल कैसे मिल सकता है?

अद्यतन

कुछ और घंटे मैं जानकारी की आवश्यकता को खोजने में कामयाब रहे है पर चारों ओर poking के बाद (संलग्न छवि देखें)। हालांकि, डेटा स्टोर करने वाले वर्ग आंतरिक मुहरबंद वर्ग हैं और मुझे इस जानकारी को वापस पाने के लिए ऑब्जेक्ट स्टेट मैनेजर से पूछताछ करने के लिए सार्वजनिक प्रविष्टि नहीं मिल रही है। तो मैं परिवर्तन का लेखा परीक्षा कर सकता हूं।

alt text

+0

क्या तुमने कभी यह पता लगा था? – DDiVita

+0

नहीं, लेकिन मुझे याद है कि @Icrepas के विकल्प को आशाजनक लग रहा था, मैं बस कोशिश करने के लिए गोल नहीं आया था। – ilivewithian

उत्तर

0

आप एक RelationshipEntry (ObjectStateEntry से निकला) की CurrentValues ​​संपत्ति के माध्यम से दो EntityKey वस्तुओं का उपयोग कर सकते हैं। आपको जो चाहिए वह आपको देना चाहिए।

+0

क्या यह एक आंतरिक मुहरबंद वर्ग नहीं है, या क्या मैं गलत नामस्थान देख रहा हूं? – ilivewithian

+0

@ilivewithian आप 'dbContext.ChangeTracker.Entities() 'विधि का उपयोग कर' CurrentValues' तक पहुंच सकते हैं, फिर प्रत्येक परिवर्तित इकाई के लिए, 'CurrentValues' नाम की एक संपत्ति होगी। –

1

इससे आपको यह पता मदद कर सकता है:

IEnumerable<IRelatedEnd> relatedEnds = ((IEntityWithRelationships) change.Entity).RelationshipManager.GetAllRelatedEnds(); 
foreach (var relatedEnd in relatedEnds) 
{ 
    foreach (var subEntity in relatedEnd) 
    { 
      if (subEntity is IEntityWithRelationships) 
      { 
      var entityAssociated = (IEntityWithRelationships)subEntity; 
      // Now you have your associated entity to work with... 
      } 
     } 
} 
संबंधित मुद्दे