धाराप्रवाह इंटरफेस विशेषताओं की तुलना में अधिक लचीले होते हैं और क्यों?


15

EF 4.1 कोड पहले ट्यूटोरियल में निम्नलिखित कोड दिया गया है:

public class Department
{
    public int DepartmentId { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Collaborator> Collaborators { get; set; }
}

फिर यह समझाया जाता है कि धाराप्रवाह इंटरफ़ेस अधिक लचीला है:

डेटा एनोटेशन निश्चित रूप से उपयोग करना आसान है, लेकिन प्रोग्रामेटिक दृष्टिकोण का उपयोग करना बेहतर है जो बहुत अधिक लचीलापन प्रदान करता है।

फिर धाराप्रवाह इंटरफ़ेस का उपयोग करने का उदाहरण दिया गया है:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Department>().Property(dp => dp.Name).IsRequired();
    modelBuilder.Entity<Manager>().HasKey(ma => ma.ManagerCode);
    modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .IsConcurrencyToken(true)
        .IsVariableLength()
        .HasMaxLength(20);
}

मैं नहीं समझ सकता कि धाराप्रवाह इंटरफ़ेस बेहतर क्यों माना जाता है। सच्ची में? मेरे दृष्टिकोण से ऐसा लगता है कि डेटा एनोटेशन अधिक स्पष्ट हैं, और इसमें स्वच्छ अर्थ का अधिक अनुभव है।

मेरा सवाल यह है कि एक धाराप्रवाह इंटरफ़ेस विशेषताओं का उपयोग करने से बेहतर विकल्प क्यों होगा, खासकर इस मामले में?

(ध्यान दें: मैं धाराप्रवाह इंटरफेस की पूरी अवधारणा के लिए काफी नया हूं, इसलिए कृपया इस पर कोई पूर्व ज्ञान की उम्मीद न करें।)

संदर्भ: http://codefirst.codeplex.com/


यह सवाल वास्तव में धाराप्रवाह इंटरफेस के बारे में नहीं है। अंतर गुण और सामान्य कोड का उपयोग करने के बीच है। यदि कोड धाराप्रवाह नहीं था, तो यह आपके प्रश्न के बारे में ज्यादा नहीं बदलेगा।
9

@svick धाराप्रवाह इंटरफेस मूल रूप से सामान्य कोड हैं, लेकिन यह इसे एक अलग तरीके से व्यक्त करता है। हम विशेषताओं के लिए सादे कोड में चीजों को निर्दिष्ट करने से दूर चले गए, अब धाराप्रवाह इंटरफेस के साथ ऐसा लगता है कि कुछ पीछे हट रहे हैं और कोड में चीजों को फिर से निर्दिष्ट करने की ओर बढ़ रहे हैं। मैं सिर्फ यह समझना चाहता हूं कि आप विशेषताओं के बजाय कोड का उपयोग क्यों करेंगे। क्या धाराप्रवाह इंटरफेस को विशेषताओं से दूर ले जाते हैं और वापस सब कुछ फिर से कोडिंग करते हैं?
तजार्ट

जवाबों:


13

डेटा एनोटेशन स्थिर हैं, उदाहरण के लिए यह विधि घोषणा रनटाइम में नहीं बदल सकती है:

  [MinLength(5)]
  [MaxLength(20,ErrorMessage="Le nom ne peut pas avoir plus de 20 caractères")]
  public new string Name { get; set; }

धाराप्रवाह इंटरफ़ेस गतिशील हो सकता है:

   if (longNamesEnabled)
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(100);
   }
   else
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(20);
   }

कोड का उल्लेख नहीं करने के लिए गुणों के बीच पुन: उपयोग किया जा सकता है।


2
आप क्यों सोचेंगे कि एक ही संपत्ति की लंबाई (या कोई अन्य संपत्ति) रन-टाइम में बदल जाएगी?
यूसुबोव

1
@ एलयूसुबोव: मैं उन परिदृश्यों से शुरू करता हूँ जहाँ मुझे कोडिंग के समय फील्ड की लंबाई नहीं पता थी।
व्याट बार्नेट

@YattBarnett: यह क्षेत्र की लंबाई को एक चर के रूप में केवल तभी समझ सकता है जब डोमेन पैरामीटर को किसी सेवा या बाहरी अन-टाइप किए गए स्रोत से गतिशील रूप से लाया जाता है। हालाँकि, डोमेन गुणों के साथ गतिशील रूप से निपटने के लिए रक्षात्मक कोडिंग दृष्टिकोण की आवश्यकता होगी।
यूसुबोव

1
@ElYusubov आपके पास दो गुण हो सकते हैं जिनकी लंबाई को छोड़कर बिल्कुल समान होने की आवश्यकता है इसलिए मैं उन्हें एक फ़ंक्शन में पास करता हूं जो उन्हें गतिशील रूप से सेट करता है। यही कारण है कि लेखक ने उन्हें अधिक लचीला कहा।
गैरेट हॉल

1
@ElYusubov, आप प्रोजेक्ट सेटिंग्स में फ़ील्ड की लंबाई को एक सेटिंग बना सकते हैं, जो कि app.config या web.config में फीड होती है। तब यदि डेटाबेस फ़ील्ड की लंबाई बदल जाती है, तो आप ऐप के एक recompile और redeploy के बिना .config फ़ाइल में लंबाई बदल सकते हैं।
Kyralessa

8

मुझे नहीं लगता कि उस बयान को मोटे तौर पर लागू किया जाना चाहिए; यह कोड प्रथम के लिए बहुत विशिष्ट है। कोड प्रथम में, डेटा एनोटेशन में कार्यक्षमता का एक सबसेट शामिल होता है जो धाराप्रवाह एपीआई में उपलब्ध होता है। दूसरे शब्दों में, कुछ निश्चित मॉडल कॉन्फ़िगरेशन हैं जो केवल धाराप्रवाह एपीआई का उपयोग करके किए जा सकते हैं।

उदाहरण के लिए, यहां कुछ चीजें हैं जो एनोटेशन का उपयोग करके निर्दिष्ट नहीं की जा सकती हैं:

  • डेटाइम प्रॉपर्टी की शुद्धता
  • संख्यात्मक गुणों का सटीक और पैमाना
  • निश्चित लंबाई के रूप में एक स्ट्रिंग या बाइनरी संपत्ति
  • गैर-यूनिकोड के रूप में एक स्ट्रिंग संपत्ति
  • रिश्तों को हटाने का व्यवहार
  • उन्नत मानचित्रण रणनीतियाँ

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


क्या आप एक उदाहरण दे सकते हैं कि केवल धाराप्रवाह एपीआई का उपयोग करके क्या किया जा सकता है? यह जानना भी दिलचस्प होगा कि उन्होंने इसे इस तरह क्यों चुना है। Im अधिक पारंपरिक तरीकों और इकाई ढांचे के रूप में स्वैच्छिक एपीआई को समझने की कोशिश कर रहा है। मैं जानना चाहता हूं कि वे इसे विशेषताओं पर क्यों पसंद करेंगे। मेरे लिए विशेषताएँ अधिक सही और पठनीय लगती हैं।
तजार्ट

1
@ टार्टार्ट मैंने कुछ उदाहरण जोड़े हैं। इसे डिजाइन करते समय, दो मुख्य प्रेरक सिद्धांत थे। सबसे पहले, देवों को चुनने की अनुमति दें। कुछ लोग पीओको के उल्लंघन के रूप में विशेषताओं को देखते हैं, अन्य उनकी घोषणात्मक प्रकृति को पसंद करते हैं। दूसरा, मौजूदा विशेषताओं का लाभ उठाएं और केवल आम परिदृश्यों के लिए नए परिचय दें। आप शायद इस बात से सहमत होंगे कि मैंने जो उदाहरण दिए हैं वे अपेक्षाकृत असामान्य हैं।
ब्रिकेलम

मैंने देखा कि OnDelete व्यवहार केवल धाराप्रवाह एपीआई में उपलब्ध है। क्या आप सोच सकते हैं कि उन्होंने इसे इस तरह क्यों चुना? यह वास्तव में क्या Im इस सवाल के साथ प्राप्त करने की कोशिश कर रहा है। यदि आप परियोजनाओं के बीच कक्षाएं साझा कर रहे हैं तो POCO उल्लंघन एक अच्छा कारण हो सकता है। यदि आप विशेषताओं का उपयोग करते हैं तो आप एक इकाई ढांचे की निर्भरता में खींचना समाप्त कर सकते हैं!
तजार्ट

@ टार्टार्ट, मुझे सटीक कारण याद नहीं हैं। मैं कोड फर्स्ट फीचर के अंत में टीम में शामिल हो गया और डिजाइन के लिए यहां नहीं था। मैं देखूंगा कि क्या मुझे टीम से किसी और को मिल सकता है हालांकि इसमें वजन करने के लिए।
bricelam

1

आपके प्रश्न का उत्तर लिंक में दिया गया है।

तब आप इस विधि के भीतर अपने डोमेन पर लागू होने वाली बाधाओं को प्रोग्रामेटिक रूप से परिभाषित करते हैं।

मूल रूप से, यह अधिक या कम वरीयता का उपयोग करता है गुण बनाम प्रोग्रामेटिक दृष्टिकोण, जहां प्रोग्रामेटिक दृष्टिकोण का इकाई पर अधिक नियंत्रण होता है। हालांकि, अपने मॉडल को सजाने के लिए एट्रिब्यूट्स जोड़ने का एक कस्टम तरीका है जिसे आप भी देख सकते हैं।

इस दृष्टिकोण का उपयोग करते समय आप टेबल और कॉलम के बीच संबंधों का भी वर्णन कर सकते हैं। निचला रेखा, यदि आप अपने डोमेन पर अधिक बारीक-दाने नियंत्रण के लिए तैयार हैं, तो आप इस नए दृष्टिकोण का उपयोग कर सकते हैं जो EF4.1 के साथ आता है।

हालांकि, सत्यापन लागू करने वाले सामान्य परिदृश्यों के लिए , ठीक काम करना चाहिए क्योंकि यह ज्यादातर मामलों को कवर करने के लिए मजबूत है; और इसके अलावा यह आपको समय बचा सकता है।


क्या आप यह बता सकते हैं कि प्रोग्रामेटिक तरीका आपको अधिक नियंत्रण कैसे देता है? मैं वास्तव में इस बिंदु पर नहीं मिल रहा हूं।
तजार्ट

उदाहरण के लिए, इसे ".IsConcurrencyToken (true)" लें - आप इसे एट्रीब्यूट परिभाषा पर कैसे करेंगे?
युसुबोव

[ConcurrencyCheck] <- जो वास्तव में सरल लगता है
Tjaart

अच्छी पकड़, आप तब "तालिकाओं और स्तंभों के बीच संबंध" का वर्णन कैसे करेंगे?
यूसुबोव

[ForeignKey ("PersonId")] <- जैसे, जो कि संभवत: ishasForeignKey (t => t.ProjectId) के समान सीधा नहीं है, हालाँकि सभी की जरूरत है कि ForeignKey () को धाराप्रवाह इंटरफ़ेस की तरह एक लैम्ब्डा लेने दें। यह अभी भी स्पष्ट नहीं करता है कि एक दूसरे से बेहतर क्यों है।
ताजरत

0

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


क्या आप इस बात का उदाहरण दे सकते हैं कि आप क्या उम्मीद नहीं कर रहे हैं और कैसे एक धाराप्रवाह इंटरफ़ेस ऐसा होने से रोकता है?
तजार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.