2012-04-05 11 views
19

मैं EntityFramework 4.3 कोड फर्स्ट में एफके रिलेशनशिप के साथ एक इकाई को अपडेट करने का प्रयास कर रहा हूं। मैं फोन करके संबंधित entites को संलग्न करने के लिए प्रयास करें: प्रवेश (आइटम) .State = EntityState.UnchangedEntityFramework Code पहले - जांच करें कि इकाई संलग्न है

मैं निम्नलिखित अपवाद: एक ही कुंजी के साथ एक वस्तु को पहले से ही ObjectStateManager में मौजूद है। ऑब्जेक्टस्टेट प्रबंधक एक ही कुंजी के साथ एकाधिक ऑब्जेक्ट्स को ट्रैक नहीं कर सकता है।

मैं इन वस्तुओं को अद्यतन नहीं करता और न ही उनके मुख्य इकाई पर उनके लिए एक आईडी संपत्ति है। क्या यह जानना संभव है कि कौन सी संस्थाएं संलग्न हैं या नहीं?

अग्रिम धन्यवाद, राडू

+0

आप सभी संस्थाओं है कि संदर्भ से ट्रैक किया जाता है पाने के लिए ObjectContext.ObjectStateManager.GetObjectStateEntries() विधि (http://msdn.microsoft.com/en-us/library/bb738497.aspx) का उपयोग कर सकते हैं। ध्यान दें कि यह संभव है कि डेटाबेस में ऐसी संस्थाएं हैं जिन्हें ऑब्जेक्ट कॉन्टेक्स्ट द्वारा ट्रैक नहीं किया गया है। आपको ऑब्जेक्टस्टेट प्रबंधक को यह जानने की आवश्यकता है कि आपको किन इकाइयों की आवश्यकता है (इस enums में फ्लैग विशेषता है ताकि आप विभिन्न मानों को गठबंधन कर सकें।) – Pawel

उत्तर

42

आप जवाब here पा सकते हैं।

public bool Exists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

उस कोड को अपने संदर्भ में रखें या आप इसे इस तरह के विस्तार में बदल सकते हैं।

public static bool Exists<TContext, TEntity>(this TContext context, TEntity entity) 
    where TContext : DbContext 
    where TEntity : class 
{ 
    return context.Set<TEntity>().Local.Any(e => e == entity); 
} 
+2

धन्यवाद। इससे मुझे भी मदद मिली। उपरोक्त फ़ंक्शन के साथ एक और नोट। आपको टी: क्लास कहां रखना है, या फिर कंपाइलर शिकायत करेगा। – Sylpheed

+0

@Sylpheed धन्यवाद, मैंने जवाब अपडेट किया है आपके सुझाव के अनुसार। –

+0

टीसीएन्टेक्स्ट आवश्यक प्रतीत नहीं होता है। पहले पैरामीटर को इसके बजाय डीबीकॉन्टेक्स्ट टाइप करने दें - सार्वजनिक स्थिर बूल मौजूद है (यह डीबीकॉन्टेक्स्ट संदर्भ, TENTITY इकाई) ... –

5

आप इस विधि का उपयोग कर सकते हैं:

/// <summary> 
    /// Determines whether the specified entity key is attached is attached. 
    /// </summary> 
    /// <param name="context">The context.</param> 
    /// <param name="key">The key.</param> 
    /// <returns> 
    /// <c>true</c> if the specified context is attached; otherwise, <c>false</c>. 
    /// </returns> 
    internal static bool IsAttached(this ObjectContext context, EntityKey key) 
    { 
     if (key == null) 
     { 
      throw new ArgumentNullException("key"); 
     } 

     ObjectStateEntry entry; 
     if (context.ObjectStateManager.TryGetObjectStateEntry(key, out entry)) 
     { 
      return (entry.State != EntityState.Detached); 
     } 
     return false; 
    } 

उदाहरण के लिए:

 if (!_objectContext.IsAttached(entity.EntityKey)) 
     { 
      _objectContext.Attach(entity); 
     } 
+3

मैंने कुछ प्रदर्शन परीक्षण किया और (आश्चर्यजनक रूप से) ऑब्जेक्टस्टेट मैनेजर पाया .ryGetObjectStateEntry 70 गुना धीमी थी सेट करें ()। Local.Any ( – Brent

संबंधित मुद्दे