2013-08-06 3 views
5

पर डिलीट नहीं किया गया है मेरे पास एक जटिल वर्ग है (नीचे उदाहरण कोड देखें) कि मैं एक इकाई फ्रेमवर्क कोड प्रथम डेटाबेस (V5) में सहेजता हूं। समस्या यह है कि यदि FooClass डेटा को FooAndOrBar डेटा में उपयोग किया जाता है जो डेटाबेस में सहेजा जाता है, तो मैं FooClass प्रविष्टि को हटाए जाने से रोकना चाहता हूं। क्योंकि यह शून्य हो सकता है तो विदेशी कुंजी जांच FooClass को हटाए नहीं जायेगी, इसलिए मुझे खुद को जांचना होगा।एंटिटी फ्रेमवर्क में मान्यता एंटीटी प्रवेश

class FooClass { ... some properties } 

    class BarClass { ... some properties } 

    class FooAndOrBar 
    { 
     public int Id { get; set; } 
     public FooClass Foo { get; set; } 
     public BarClass Bar { get; set; } 
    } 

इसलिए, प्रविष्टियों कि कई डेटाबेस प्रविष्टियों भर में कटौती मान्य के लिए अच्छा अभ्यास के बाद, मैं इकाई की रूपरेखा के ValidateEntity विधि करने के लिए एक परीक्षण के रूप में नीचे दिखाया गया जोड़ा।

protected override DbEntityValidationResult ValidateEntity(
     DbEntityEntry entityEntry, IDictionary<object, object> items) 
    { 
     if (entityEntry.Entity is FooClass && 
      entityEntry.State == EntityState.Delete) 
     {    
      if (... entityEntry.Entity is used in DbContext.FooAndOrBars ...) 
       return new DbEntityValidationResult(... error ...); 
     } 

     return base.ValidateEntity(entityEntry, items); 

    } 

समस्या यह है कि ValidateEntity को हटाने पर नहीं कहा जाता है। यह समझ में आता है (आप जो कुछ हटाने जा रहे हैं उसे वैध क्यों करें) लेकिन मुझे समस्या कहां छोड़नी चाहिए कि मुझे चेक कहां रखना चाहिए? मैं एक यूनिटऑफवर्क/रिपोजिटरी पैटर्न का उपयोग करता हूं और वहां एक परीक्षण कर सकता हूं, लेकिन वह बदबू आ रही है।

क्या कोई और इस समस्या को पूरा करता है और इसे एक साफ तरीके से हल करता है? आपके इनपुट की सराहना की जाएगी।

पावेल से उत्तर (नीचे देखें)।

@pawel ने इंगित किया कि आप ShouldValidateEntity को ओवरराइड कर सकते हैं ताकि हटाए गए आइटमों के लिए ValidateEntity को बुलाया जा सके। अगर किसी और को यह उपयोगी लगता है तो यहां कुछ उदाहरण कोड दिया गया है।

/// <summary> 
/// Override ShouldValidateEntity to cause deleted entities to be checked as well 
/// </summary> 
protected override bool ShouldValidateEntity(DbEntityEntry entityEntry) 
{ 
    if (entityEntry.State == EntityState.Deleted) 
     return true; 

    return base.ShouldValidateEntity(entityEntry); 
} 

मैं वास्तव में जाँच एक सा इकाई के प्रकार के लिए जाँच करके सिर्फ हटाए गए सभी आइटम अधिक कठोर बना है, लेकिन है कि बस के प्रदर्शन में सुधार करने के लिए है।

+0

प्रारंभ में यह मुझे नियंत्रक में एक हटाने की कार्रवाई के बारे में सोचता है। – nocturns2

उत्तर

11

डिफ़ॉल्ट रूप से केवल संशोधित और अतिरिक्त इकाइयां मान्य हैं। हटाए गए इकाइयों के लिए भी सही लौटने के लिए DbContext.ShouldValidateEntity() विधि को ओवरराइड करके इसे बदला जा सकता है।

+0

हाय @ पवेल। यही वही है जो मुझे चाहिए और यह पूरी तरह से काम किया। मैं परिवर्तनों को ट्रैक करने के लिए डीबीकॉन्टेक्स्ट में मौजूद कोड में परीक्षण कर सकता था, लेकिन वह मिश्रित सत्यापन और ट्रैकिंग, जो एक स्मार्ट विचार नहीं है। मैंने अपने जवाब में उदाहरण कोड शामिल किया है। –

+0

खुशी है कि यह आपके लिए काम करता है और समाधान दिखाने के लिए कोड जोड़ने के लिए धन्यवाद। – Pawel

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