2011-11-15 18 views
18

ईएफ 4.0 में, यदि मैं इसे सही समझता हूं, तो इकाई में दो प्रकार के मान हैं: वर्तमान मान और मूल मान।
हम ApplyOriginalValues ​​(TENTITY) विधि को कॉल करके मूल मान सेट कर सकते हैं लेकिन मूल मान कैसे प्राप्त करें?इकाई फ्रेमवर्क में किसी इकाई के मूल मान कैसे प्राप्त करें?

उत्तर

13

आप उन के माध्यम से उपयोग कर सकते हैं ObjectStateEntry

var originalValues = context 
     .ObjectStateManager.GetObjectStateEntry(myEntity).OriginalValues; 
+0

मूल वैल्यू DbDataRecord प्रकार है। इसे इकाई प्रकार में कैसे परिवर्तित करें? – JatSing

+0

@Sun इसमें इकाई प्रकार नहीं हैं। आपको मूल्यों को उचित प्रकार में डालना होगा। उदाहरण के लिए 'var name = (string) originalValues ​​["name"]; ' – Eranga

27

@Eranga जवाब एफई 5. किसी कारण के लिए पुरानी है, एफई 5 ठीक जब इस तरह की एक कथन का उपयोग मूल मूल्यों हो रही काम नहीं करता:

var originalValues = context.Entry(myEntity).OriginalValues; 

मेरे काम कर समाधान DbSet से AsNoTracking() विधि का उपयोग करता, नीचे दिए गए उदाहरण की तरह:

var originalEntity = context.MyEntities.AsNoTracking().FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID); 
+1

AsNoTracking() बेहतर प्रदर्शन भी - Google इसे – Moji

+0

केवल संशोधित मान कैसे प्राप्त करें ?? –

+0

@AwaisMahmood मुझे लगता है कि यह एक अलग सवाल के लायक है। –

6

यह निम्न के लिए आगे परिष्कृत किया जा सकता:

var originalEntity = context.MyEntities.AsNoTracking() 
     .FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID); 

Where ऊपर, अच्छा, जवाब में जरूरत नहीं है।

0

मैं एक समान समस्या में भाग गया और AsNoTracking मेरी स्थिति के लिए एक विकल्प नहीं था इसलिए मैं कुछ ऐसा करने के लिए आया जो मेरे लिए पर्याप्त रूप से काम करता है: पहले "क्लोन" इकाई तब परिवर्तन करता है।

public T Clone<T>(T entity) 
    where T : class, new() { 

    var clone = new T(); 

    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy) 
    .Where(a => a.CanRead && 
       a.CanWrite && 
       a.GetMethod.IsFinal); 

    foreach (var property in properties) {  
    property.SetValue(clone, property.GetValue(entity)); 
    } 

    return clone; 
} 

और उसके बाद क्लोन को बदले में तुलना करें।

public string GenerateChangeText<T>(T original, T current) 
    where T : class, new() { 

    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy) 
    .Where(a => a.CanRead && 
       a.CanWrite && 
       a.GetMethod.IsFinal); 

    var changes = string.Empty; 

    foreach (var property in properties) { 

    var originalValue = property.GetValue(original); 
    var currentValue = property.GetValue(current); 

    if (originalValue == null && currentValue == null) continue; 
    if ((originalValue != null && !originalValue.Equals(currentValue)) || 
     (currentValue != null && !currentValue.Equals(originalValue))) { 

     changes += $" changed {property} from {original ?? "NULL"} to {current ?? "NULL"}."; 
    } 
    } 

    return changes; 
} 
0

उपयोग में इकाई फ्रेमवर्क के कुछ संस्करण हैं।

मैं अपने आप को कोड पहले और यह कि एपीआई के साथ यह आसान है के रूप में

_context.Entry(Entity).Reload(); 

डॉक्स https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.103).aspx

पुराने एपीआई ObjectContext पर एक ताज़ा विधि है जो कुछ उपयोग के मामलों में मदद कर सकता है

ObjectContext.Refresh(RefreshMode.StoreWins, Entity); 

डॉक्स https://msdn.microsoft.com/en-us/library/bb896255(v=vs.110).aspx

0

यह उत्तर एंटिटी फ्रेमवर्क 6 को संदर्भित करता है। ईएफ 6 में एक मूल मान और वर्तमान मान https://msdn.microsoft.com/en-us/library/gg679512(v=vs.113).aspx एक अच्छा जवाब ढूंढने और नहीं ढूंढने के बाद मैं निम्नलिखित परीक्षण फ़ंक्शन के साथ आया और सोचा कि मैं इसे दूसरों को पोस्ट करने की आवश्यकता के लिए पोस्ट करूंगा वही।

private void test() 
    { 
     // table has a field Description of type varchar(200) 
     WDMDBEntities context = new WDMDBEntities(); 
     var query = context.Brands; 
     List<Brand> records = query.ToList(); 
     if (records.Count > 0) 
     { 
      Brand currentRecord = records[0]; 
      currentRecord.Description = "some new text"; 
      string originalValue = null; 
      switch (context.Entry(currentRecord).State) 
      { 
       case System.Data.Entity.EntityState.Added: 
        originalValue = null; 
        break; 
       case System.Data.Entity.EntityState.Deleted: 
       case System.Data.Entity.EntityState.Detached: 
       case System.Data.Entity.EntityState.Modified: 
       case System.Data.Entity.EntityState.Unchanged: 
        originalValue = context.Entry(currentRecord).Property(u => u.Description).OriginalValue; 
        break; 
      } 
     } 
     context.Dispose(); 
    }