2011-10-13 6 views
7

कृपया मुझे बताओ अगर यह प्राप्त करते समय यह मैं आईडी होना दी बिना एक इकाई को हटाने के लिए एक सभ्य तरीका है।इकाई की रूपरेखा कोड पहले हटा कर आईडी ला रहा है बिना (जेनेरिक शैली)

public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new() 
{ 
    var obj = Ctx.Entry(entity); 
    if (obj.State == System.Data.EntityState.Detached) 
    { 
     Ctx.Set(typeof(TEntity)).Attach(obj.Entity); 
    } 
    Ctx.Set(typeof(TEntity)).Remove(obj.Entity); 
} 
:

public interface IStore : IReadOnlyStore 
{ 
    void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new(); 
    void SaveChanges(); 
} 

और वह इंटरफेस के ठोस स्टोर कक्षा में, यहाँ मेरी हटाने विधि है:

मैं (मैं केवल हटाएं दिखाता हूँ) निम्नलिखित इंटरफेस के साथ एक सामान्य दुकान

Store.Delete(new Foo() { Id = request.Entity.Id }); 

के साथ-साथ एक इकाई को लाते समय और उसके बाद कल्ली:

मैं दोनों Newing ऊपर एक इकाई का परीक्षण किया है एनजी हटाएं।

डिबगिंग के माध्यम से, मैं वांछित है दोनों परिदृश्यों पर प्रभावित करते हैं।

मैं सिर्फ यकीन है कि यह एक अच्छा डिजाइन है और वहाँ इस दृष्टिकोण के लिए कोई साइड इफेक्ट हैं कि बनाना चाहते हैं।

संदर्भ के लिए, ctx सिर्फ DbContext ही है।

धन्यवाद।

उत्तर

3

यह अच्छा डिजाइन है और साइड इफेक्ट नहीं है :) (IMHO)

दो टिप्पणी:

public void Delete<TEntity>(TEntity entity) 
    where TEntity : class, IEntity, new() 
{ 
    Ctx.Entry(entity).State = EntityState.Deleted; 
} 
:

  • मैं सोच रहा हूँ अगर आप के द्वारा अपने Delete विधि को सरल बनाने सकता है

    मुझे आशा है कि Deleted करने के लिए राज्य की स्थापना स्वचालित रूप से अगर इकाई पहले से संलग्न नहीं है जोड़ देती है जाएगा। लेकिन मुझे यकीन नहीं है कि यह काम करता है। (मुझे बताएं कि यह संलग्न और अलग परिदृश्यों के लिए काम करता है (यदि आपको इसका परीक्षण करना चाहिए)।

  • यदि आपके पास दिमाग में प्रदर्शन अनुकूलन है (इकाइयों को लोड करने से परहेज करें) तो यह मत भूलना कि यदि एकाधिक हैं संदर्भ में हटाने के लिए इकाइयां, SaveChanges अभी भी डेटाबेस में प्रति इकाई एक एकल DELETE कथन भेज देगा। ईएफ के साथ थोक हटाना प्रदर्शन में काफी भयानक है और यह एक इलाका है जहां एसक्यूएल स्टेटमेंट पर वापस जा रहा है (हटाएं ... कहां ... आईएन ... कई आईडी ....) कभी-कभी समझ में आता है (यदि प्रदर्शन मायने रखता है)।

+0

yoru प्रतिक्रिया के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की, लेकिन यह मेरे यूनिट परीक्षणों में से 50% से अधिक की मौत हो गई। सामान्य त्रुटि प्रतीत होती है: उन इकाइयों को सहेजते समय एक त्रुटि हुई जो उनके रिश्तों के लिए विदेशी कुंजी गुणों का खुलासा नहीं करती है। EntityEntries प्रॉपर्टी शून्य वापस आ जाएगी क्योंकि एक इकाई को अपवाद के स्रोत के रूप में पहचाना नहीं जा सकता है। बचत के दौरान अपवादों को संभालना आपके इकाई प्रकारों में विदेशी कुंजी गुणों को उजागर करके आसान बना दिया जा सकता है। – Forest

+0

विवरण के लिए InnerException देखें। ---> System.Data.UpdateException: 'Foo_Siblings' एसोसिएशनसेट से एक रिश्ते 'हटाए गए' राज्य में है। बहुगुणित बाधाओं को देखते हुए, 'हटाए गए' राज्य में एक संबंधित 'Foo_Siblings_Target' भी होना चाहिए। – Forest

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