28

नोट: मैं इकाई की रूपरेखा संस्करण 5सबसे अधिक कुशलता से बनाएँ, अद्यतन हैंडलिंग, साथ इकाई की रूपरेखा कोड पहले हटाएँ

उपयोग कर रहा हूँ मेरी सामान्य भंडार के अंदर, मैं नीचे के रूप में Add, Edit और Delete तरीकों :

public class EntityRepository<T> : IEntityRepository<T> 
    where T : class, IEntity, new() { 

    readonly DbContext _entitiesContext; 

    public EntityRepository(DbContext entitiesContext) { 

     if (entitiesContext == null) { 

      throw new ArgumentNullException("entitiesContext"); 
     } 

     _entitiesContext = entitiesContext; 
    } 

    //... 

    public virtual void Add(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Added; 
     } 
     else { 

      _entitiesContext.Set<T>().Add(entity); 
     } 
    } 

    public virtual void Edit(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State == EntityState.Detached) { 

      _entitiesContext.Set<T>().Attach(entity); 
     } 

     dbEntityEntry.State = EntityState.Modified; 
    } 

    public virtual void Delete(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Deleted; 
     } 
     else { 

      DbSet dbSet = _entitiesContext.Set<T>(); 
      dbSet.Attach(entity); 
      dbSet.Remove(entity); 
     } 
    } 
} 

क्या आपको लगता है कि ये विधियां अच्छी तरह से लागू की गई हैं या नहीं? विशेष रूप से Add विधि। क्या नीचे Add विधि को लागू करना बेहतर होगा?

public virtual void Add(T entity) { 

    DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
    if (dbEntityEntry.State == EntityState.Detached) { 

     _entitiesContext.Set<T>().Attach(entity); 
    } 

    dbEntityEntry.State = EntityState.Added; 
} 
+0

क्या यह कोड प्रथम का उपयोग कर रहा है? – PositiveGuy

+1

@CoffeeAddict यह ईएफ 5.0.0 है। डीबी पहले या कोड पहले, इससे कोई फर्क नहीं पड़ता मुझे लगता है कि यह एक सामान्य भंडार कोड है। – tugberk

+0

आप नई रिलीज लाइब्रेरी का उपयोग कर सकते हैं जो *** स्वचालित रूप से इकाई ग्राफ *** में सभी इकाइयों की स्थिति सेट करेगा। आप [उसी प्रश्न के मेरे उत्तर] को पढ़ सकते हैं (http://stackoverflow.com/questions/5557829/update-row-if-it-exists-else-insert-logic-with-entity-framework/39609020#39609020) । –

उत्तर

37

जोड़ने के लिए:

public bool Add<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Added; 
      Save(); 
     } 

अद्यतन के लिए:

public bool Update<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Modified; 
      Save(); 
     } 

हटाने के लिए:

public bool Delete<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Deleted; 
      Save(); 
     } 

और एक निजी Save() विधि है कि सही या गलत रिटर्न ताकि आप परिणाम

private bool Save() 
     { 
      return DataContext.SaveChanges() > 0;     
     } 

इस पर निर्भर करता है नियंत्रक में आसान वापस आने कर सकते हैं केवल अपने सामान्य भंडार के एक हिस्से है। यह एंटरप्राइज़ अनुप्रयोगों में बहुत अच्छा काम करता है।

अद्यतन:

अलग केवल विशिष्ट वस्तु विधि के लिए पारित प्रभावित करता है। यदि ऑब्जेक्ट को अलग करने के ऑब्जेक्ट को ऑब्जेक्ट संदर्भ में संबंधित ऑब्जेक्ट्स हैं, तो ऑब्जेक्ट्स अलग नहीं हैं।

ईएफ स्वचालित रूप से किसी इकाई की स्थिति सेट करते समय या SaveChanges() कहलाते समय ग्राफ़ में पृथक ऑब्जेक्ट संलग्न करेगा।

मुझे वास्तव में पता नहीं है कि आपको संदर्भ से वस्तुओं को अलग करने की आवश्यकता क्यों है। आप डेटाबेस से इकाइयों को लोड करने के लिए पहले स्थान पर अटैचमेंट किए बिना AsNoTracking() का भी उपयोग कर सकते हैं।

+0

क्या होता है यदि आप 'एड' या 'एडिट' विधि में गुजर रहे ऑब्जेक्ट को 'अलग' स्थिति पर है? – tugberk

+0

मेरे उत्तर में अपडेट किया गया देखें। –

+0

उत्तर के लिए धन्यवाद। – tugberk

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