एंटिटी फ्रेमवर्क कोड प्रथम - फ़्लोट अपी बनाम डेटा एनोटेशन के फायदे और नुकसान [बंद]


120

एंटिटी फ्रेमवर्क कोड-प्रथम का उपयोग करके एक डेटाबेस बनाते समय, कोड से बहुत सारे डेटाबेस मॉडल निकाले जा सकते हैं। मॉडल को ठीक करने के लिए धाराप्रवाह एपीआई और / या विशेषताओं का उपयोग किया जा सकता है।

डेटा एनोटेशन की तुलना में धाराप्रवाह एपी के फायदे और नुकसान क्या हैं? दूसरे शब्दों में: भले ही कुछ स्थितियों में दोनों विधियों का उपयोग किया जा सकता है, किन मामलों में एक विधि को दूसरे के ऊपर प्रबल होना चाहिए?


3
बस एक विचार: मैं आमतौर पर अपने POCOs के साथ एक मॉडल प्रोजेक्ट बनाता हूं, और फिर रिपोजिटरी प्रोजेक्ट में, खासतौर पर EF के लिए POCO का एक नया सेट बनाता हूं, और वहां अपना एनोटेशन डालता हूं। फिर मैं मैपर क्लासेस में दोनों के बीच का नक्शा बनाता हूँ। इस तरह, मेरा मॉडल अछूता रहता है, और यदि आवश्यक हो तो मेरी डेटा रणनीति को जोड़ना / बदलना आसान बनाता है (उदाहरण के लिए XmlRepository जोड़ें और समान मॉडल वर्ग का उपयोग करें)।
एडिमारो

1
मैं अब EFCore और अतिरिक्त पुस्तकालयों के साथ एनोटेशन को प्राथमिकता देता हूं। (कम कोड की आवश्यकता है, और एक ही स्थान पर है) github.com/isukces/EfCore.Shaman - एड और फैली विशेषताओं github.com/borisdj/EFCore.FluentApiToAnnotation - उपयोगी जब डीबी पहले से ही मौजूद हैं, रिवर्स इंजीनियरिंग कर रही है और छोड़ने के बाद भी कोडफ़र्स्ट
बोरिसडज

जवाबों:


141

सब कुछ आप DataAnnotations के साथ कॉन्फ़िगर कर सकते हैं धाराप्रवाह एपीआई के साथ भी संभव है। उल्टा सच नहीं है। इसलिए, कॉन्फ़िगरेशन विकल्पों और लचीलेपन के दृष्टिकोण से धाराप्रवाह एपीआई "बेहतर" है।

कॉन्फ़िगरेशन उदाहरण (निश्चित रूप से पूरी सूची नहीं) जो कि धाराप्रवाह एपीआई में संभव हैं, लेकिन DataAnnotations (जहां तक ​​मैं देख सकता हूं) के साथ नहीं:

  • कैस्केडिंग डिलीट को बंद करें:

    .WillCascadeOnDelete(false)

  • डेटाबेस में विदेशी कुंजी कॉलम नाम निर्दिष्ट करें जब कुंजी आपके ऑब्जेक्ट मॉडल में उजागर नहीं होती है:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • रिश्तों की बारीक बारीक ट्यूनिंग, विशेषकर उन सभी मामलों में जहां एक एसोसिएशन का केवल एक पक्ष वस्तु मॉडल में उजागर होता है:

    .WithMany(...), WithOptional(...), WithRequiredDependent(...),WithRequiredPrincipal(...)

  • ऑब्जेक्ट मॉडल और डेटाबेस तालिकाओं (तालिका-प्रति-पदानुक्रम, तालिका-प्रति-प्रकार, तालिका-प्रति-कंक्रीट-कक्षा) के बीच विरासत मानचित्रण की विशिष्टता:

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

संपादित करें: Microsoft धाराप्रवाह एपीआई को "उन्नत सुविधा" ( यहां से उद्धरण ) के रूप में मानता है :

धाराप्रवाह एपीआई को एक अधिक उन्नत सुविधा माना जाता है और हम डेटा एनोटेशन का उपयोग करने की अनुशंसा करेंगे जब तक कि आपकी आवश्यकताओं को धाराप्रवाह एपीआई का उपयोग करने की आवश्यकता न हो।

लेकिन मेरी राय में आप DataAnnotations की सीमाओं तक बहुत जल्दी (शायद बेहद सरल वस्तु मॉडल को छोड़कर) पहुंच जाते हैं। यदि आप अपने मॉडल को DataAnnotations के साथ ठीक से ट्यून नहीं कर सकते हैं, तो आपका अंतिम उपाय डिफ़ॉल्ट मानचित्रण सम्मेलनों का पालन करना है (उन नियमों के अनुसार अपने गुणों का नामकरण करके)। वर्तमान में आप सम्मेलनों को अधिलेखित नहीं कर सकते हैं (केवल उन्हें अक्षम करें; एमएस भविष्य ईएफ रिलीज में सम्मेलनों के लिए कॉन्फ़िगरेशन विकल्प देने की घोषणा की)। लेकिन अगर आप अपने ऑब्जेक्ट मॉडल को परिभाषित करते समय मानचित्रण सम्मेलनों से मजबूर नहीं होना चाहते हैं, तो आपका एकमात्र विकल्प धाराप्रवाह एपीआई है।

धाराप्रवाह एपीआई सीखना लगभग एक चाहिए, DataAnnotations सरल अनुप्रयोगों के लिए एक अच्छा है।


2
मैं इस क्षेत्र में नौसिखिया हूं। क्या DataAnnotation के रूप में उपयोगकर्ता इंटरफ़ेस को मान्य करने के लिए धाराप्रवाह एपीआई का उपयोग किया जा सकता है?
मेरी बगल चुंबन

27
@CounterTerrorist: मुझे ऐसा नहीं लगता। उदाहरण के लिए: यदि आप [Required]किसी गुण को ASP.NET MVC अनुप्रयोग में किसी संपत्ति पर रखते हैं तो इसका उपयोग EF और MVC द्वारा सत्यापन प्रयोजनों के लिए किया जाएगा क्योंकि दोनों ही इस विशेषता को संसाधित कर सकते हैं। लेकिन MVC धाराप्रवाह एपीआई कॉन्फ़िगरेशन को नहीं समझेगा। इसलिए, यदि आप HasRequiredईएफ़टी के बजाय फ़्लूएंट एपीआई में विशेषता और उपयोग को हटा देते हैं, तो यह एमवीसी के लिए नहीं बल्कि समान होगा। (मेरी राय में विशेषताओं को अलग-अलग नाम दिया जाना चाहिए था, अलग-अलग घटकों से और अलग-अलग उद्देश्यों के लिए डेटानोटेशन नामस्थान का उपयोग बहुत भ्रामक है।)
सोलामा

4
इसके अलावा [DefaultValue()]धाराप्रवाह भी ध्यान दें संभव नहीं है।
वेबनोब

4
MinValue एक विशेषता है जिसे धाराप्रवाह एपीआई (प्रोग्रामिंग एंटिटी फ्रेमवर्क: कोड फर्स्ट) के माध्यम से परिभाषित नहीं किया जा सकता है (स्रोत: कॉग द्वारा हटाए गए NAA )
सर्ज बलेस्टा

7
स्थापत्य की दृष्टि से, मुझे लगता है Fluent APIकि आपके कार्यान्वयन का तर्क आपमें बना रहेगा DbContextऔर आप को POCOसाफ रखेंगे
ल्यूक टी ओ'ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.