दिलचस्प पोस्ट
मौजूदा गीतम भंडार को एक दूसरे में कैसे आयात करें? सी + + समारोह टेम्पलेट आंशिक विशेषज्ञता? क्या मैं #define, enum या const का उपयोग करना चाहिए? Angularjs autocomplete $ http से Java 8 में उदाहरण विधि संदर्भ प्रकारों में क्या अंतर है? .कीकोड बनाम। जो विभिन्न डिवाइसों के लिए मेरे ओपन के उत्पादन अलग-अलग क्यों हैं? एंड्रॉइड स्टूडियो ट्रांसफ़ॉर्म एक्सपैशन: त्रुटि: कार्य के लिए निष्पादन विफल ': एप: ट्रांसफ़ॉर्म क्लासेसहैडडेक्सफ़ोर्डडब्यूब' नोक्लास डीफफाउंड एरर – ग्रहण और एंड्रॉइड कैसे विंडोज 7 मशीन पर जीसीसी स्थापित करने के लिए? स्ट्रिंग को डेकटाइम को लिनक-टू-एंटिटी का प्रयोग करने में बड़ा मुद्दा Node.js परिनियोजन सेटिंग्स / कॉन्फ़िगरेशन फ़ाइलों को कैसे संग्रहीत करें? अजगर प्रमाणित सत्यापन urllib2 को अनदेखा करें जेलेट में एचटीएमएल <चयन करें> ड्रॉपडाउन सूची भरने वाले मूल्यों में डेटाबेस से मिले आईओएस 10 – कैमरा, माइक्रोफ़ोन और फोटो लाइब्रेरी की अनुमति देने में परिवर्तन जिससे दुर्घटना के लिए आवेदन हो

क्या इकाई फ़्रेमवर्क में 0..1 से 0..1 रिश्ते को हासिल करना संभव है?

Entity Framework में एक नाकामणीय विदेशी कुंजी रिश्ते के लिए एक रिक्त नेविगेशन संपत्ति बनाने का एक तरीका है? डेटाबेस की भाषा में, 0. 1 से 0. 1 रिश्ते

मैंने नीचे की कोशिश की है, लेकिन मुझे त्रुटि संदेश मिल रहा है:

प्रकार 'प्रकार 1' और 'टाइप 2' के बीच एक संघ के प्रमुख अंत को निर्धारित करने में असमर्थ इस सहयोग के मुख्य अंत को स्पष्ट रूप से रिश्तेदार API या डेटा एनोटेशन के संबंध में स्पष्ट रूप से कॉन्फ़िगर किया जाना चाहिए।

public class Type1 { public int ID { get; set; } public int? Type2ID { get; set; } public Type2 Type2 { get; set; } } public class Type2 { public int ID { get; set; } public int? Type1ID { get; set; } public Type1 Type1 { get; set; } } 

मैं समझता हूं कि पूर्णांक कॉलम केवल एक मेज या दूसरे में ही मौजूद हो सकता है, लेकिन निश्चित रूप से सभी आवश्यक मामलों को कवर करना संभव है? उदाहरण के लिए:

 Type1 Type2 ======== =============== ID ID | Type1ID -------- --------------- 1 1 | null 2 2 | 2 

मैंने डेटा एनोटेशन (उदाहरण के लिए [ForeignKey] [InverseProperty] एक छोर पर, [InverseProperty] दोनों पर) का उपयोग करने की कोशिश की है, लेकिन इनमें से कोई भी इस मामले की मदद नहीं कर रहा है।

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

यहां एक रोचक कार्य है- इसका मतलब है कि संस्था ढाँचे में इस तरह के रिश्ते पर कब्जा करना संभव नहीं है (प्रभावी रूप से, एक वस्तु जो वैकल्पिक रूप से संग्रह का हिस्सा है) – यदि हां, तो क्या कोई ऐसा दस्तावेज है जो इसका समर्थन करेगा? ।

वेब के समाधान से एकत्रित समाधान "क्या इकाई फ़्रेमवर्क में 0..1 से 0..1 रिश्ते को हासिल करना संभव है?"

"यह मुश्किल नहीं हो सकता" यह है कि मैं क्या हूं जब मैंने आपका प्रश्न पढ़ा। लेकिन फिर मैंने पाया कि एक से एक संगठन विश्वासघाती कमीनों हैं ये रहा।

मुझे लगता है कि 0..1 – 0..1 आप का मतलब है कि दो ऑब्जेक्ट एक दूसरे से स्वतंत्र हो सकते हैं, लेकिन यह विशेष रूप से एक दूसरे से जुड़ा हो सकता है।

चलो यह ठोस बना देता है Car और Driver कई कारों और चालकों का एक पूल कल्पना करो, उनमें से कार और ड्राइवरए। अब मान लें कि आप CarA को DriverA से संबद्ध करने के लिए चाहते हैं, और आपका कार्यान्वयन यह है कि DriverA खुद को Cara से जोड़ता है। लेकिन जैसे ही DriverA यह करता है, आप चाहते हैं कि CarA को केवल ड्राइवर के लिए ही किया जाए, CarA का सहयोग वैकल्पिक नहीं है , इसलिए इसे तुरंत सेट किया जाना चाहिए

इसे कैसे लागू किया जाए?

विकल्प 1:

यदि यह काम करने वाला मॉडल है:

 public class Car { public int CarId { get; set; } public string Name { get; set; } public int? DriverId { get; set; } public virtual Driver Driver { get; set; } } public class Driver { public int DriverId { get; set; } public string Name { get; set; } public int? CarId { get; set; } public virtual Car Car { get; set; } } 

तकनीकी रूप से, DriverA को CarA और CarA को एक विदेशी कुंजी DriverB के लिए एक विदेशी कुंजी हो सकती है

यहां छवि विवरण दर्ज करें

इसलिए, जब विदेशी कुंजी DriverA-CarA स्थापित हो जाए, तो आपको " DriverA-CarA " रिवर्स विदेशी कुंजी CarA-DriverA स्थापना करना चाहिए यह आपको कोड में कुछ करना चाहिए, जिसका अर्थ है कि यह एक व्यावसायिक नियम है । और वास्तव में, यह एक परमाणु आपरेशन नहीं है, इसलिए आपको यह सुनिश्चित करना होगा कि यह एक डेटाबेस लेन-देन में किया गया है।

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

एक वैकल्पिक मानचित्रण का प्रस्ताव यहां किया गया था। मैंने कोशिश की कि लेकिन दो वैकल्पिक संघों के साथ:

Driver के मानचित्रण विन्यास में:

 this.HasOptional(t => t.Car).WithMany().HasForeignKey(d => d.CarId); 

Car के मैपिंग कॉन्फ़िगरेशन में:

 this.HasOptional(t => t.Driver).WithMany().HasForeignKey(c => c.DriverId); 

(कोई डेटा एनोटेशन विकल्प नहीं है)

मैंने पाया कि ईएफ केवल एक नया ड्राइवर और कार बनाने के दौरान डेटाबेस में एक विदेशी कुंजी मान सेट करता है आपको अपने स्वयं के लेन-देन को प्रबंधित करने के लिए, दोनों संगठनों को अलग से सेट और सहेजना होगा। मौजूदा वस्तुओं के साथ आप को अभी भी दोनों विदेशी कुंजी सेट करना पड़ता है, यद्यपि यह एक सेव SaveChanges कॉल में बचाया जा सकता है।

बेहतर विकल्प? चलो देखते हैं…

विकल्प 2:

यह लिंक से संबंधित एक-से-कई संघों का उल्लेख किया गया है। इस मॉडल को बाहरी बाधाओं की जरूरत है, लेकिन एसोसिएशन बनाने परमाणु है। और आपको अभी भी एक छोर पर संदर्भ मिल गया है और दूसरे छोर पर एक संग्रह है। और यह आसानी से ईएफ के साथ नक्शे

विकल्प 3:

आप Car और Driver लिए दो विदेशी कुंजी वाली एक जंक्शन टेबल CarDriver बना सकते हैं, जिनमें से दोनों अपनी अनूठी प्राथमिक कुंजी बनाते हैं:

यहां छवि विवरण दर्ज करें

यह नियमित रूप से कई-से-कई संघ हैं डिफ़ॉल्ट रूप से, ईएफ इस प्रकार एक क्लास मॉडल के रूप में मैप करेगा जिसमें Car और Driver को एक दूसरे को इंगित करने के लिए संग्रह प्रॉपर्टी मिलती है, और जंक्शन तालिका सीधे मैप नहीं की जाती है:

 public class Car { public int CarId { get; set; } public string Name { get; set; } public virtual ICollection<Driver> Drivers { get; set; } } public class Driver { public int DriverId { get; set; } public string Name { get; set; } public virtual ICollection<Car> Cars { get; set; } } 

अब एसोसिएशन का निर्माण एक परमाणु आपरेशन है। ईएफ के साथ इस मॉडल को मैप करने के लिए पूरी तरह से संभव है। पारस्परिक संदर्भ FirstOrDefault() गए हैं, लेकिन फिर भी आप एक संग्रह के संदर्भ के रूप में संग्रह संपत्तियों के FirstOrDefault() प्राप्त कर सकते हैं।

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

विकल्प 4

विकल्प 3 परमाणु है, लेकिन इसके लिए बाहरी बाधाओं की भी जरूरत होती है। एक संघ अनन्य बनाने के लिए, CarDriver में दोनों कॉलम में अद्वितीय चाबियाँ होनी चाहिए, इसलिए प्रत्येक कार या ड्राइवर केवल तालिका में एक बार ही हो सकता है। इन इंडेक्सस द्वारा मॉडल एक द्वि-दिशात्मक वैकल्पिक 1: 1 एसोसिएशन को स्वयं के द्वारा लागू करता है। किसी भी कोड पर नियमों का पालन करना है। सही सलामत…

लेकिन क्या आप चाहते हैं कि?

आप कभी भी ईएफ कोड में विकल्प 4 को कॉन्फ़िगर नहीं करेंगे- पहले। धाराप्रवाह मानचित्रण और न ही डेटा एनोटेशन के साथ। आपको यह करने के लिए माइग्रेशन का उपयोग करना होगा, या डेटाबेस का काम-पहले।

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

इसके अलावा, विकल्प 4 के साथ भी आपको इसे बनाने का प्रयास करने से पहले संघ के अस्तित्व को देखने के लिए व्यावसायिक तर्क की आवश्यकता है, अन्यथा एक बदसूरत डाटाबेस अपवाद आपके लिए ऐसा करेगा।

निष्कर्ष

विकल्प 1 आपके लिए क्या सबसे ज्यादा है लेकिन मुझे दोनों विदेशी कुंजी को सेट करने की दायित्व पसंद नहीं है, इसे भविष्य के डेवलपर्स द्वारा आसानी से भुलाया जाता है या उन्हें अनदेखा कर दिया जाता है।

लेकिन विकल्प 2 और 3 में कोडित व्यावसायिक नियमों के मामले में भी भारी आवश्यकताएं हैं जिन्हें भुला दिया जा सकता है। और संग्रह अस्वाभाविक है क्योंकि सरोगेट "1" समाप्त होता है विकल्प 3 में मेरे पास कुछ अपील है क्योंकि Car और Driver डेटाबेस में पूरी तरह से स्वतंत्र हैं और एसोसिएशन गैर रिक्तयोग्य विदेशी कुंजी के साथ एक रिकॉर्ड है (डीबीए भी इसे पसंद करते हैं)

विकल्प 4 की एक ही अपील है, और यह सबसे अच्छा विकल्प है जब एकाधिक अनुप्रयोगों को बाहरी बाधाओं को लागू करना होगा जिन्हें विकल्प 2 और 3 पर लगाया जाना चाहिए। इसके अलावा, यहां तक ​​कि कोडित नियम भी भूल गए हैं, तो भी डेटाबेस की कमी एक अंतिम पकड़ है । लेकिन यह आसानी से ईएफ कोड द्वारा कार्यान्वित नहीं किया जा सकता है-पहले।

ऐसा नहीं है कि आप इकाई ढांचा के साथ टेबल कैसे बनाते हैं। उन वर्गों के लिए सही घोषणा है:

 public class Type1 { public int ID { get; set; } } public class Type2 { public int ID { get; set; } public virtual Type1 @Type1 { get; set; } } 

संपादित करें: मुझे लगता है कि आप जो करना चाहते हैं, उसका सबसे आसान तरीका यह है:

  public class Type1 { public int ID { get; set; } public virtual ContainerClass {get; set;} } public class Type2 { public int ID { get; set; } public virtual ContainerClass {get; set;} } public class ContainerClass { public int ID {get;set;} public virtual Type1 @Type1 {get;set;} public virtual Type2 @Type2 {get;set;} } 

स्मृति से ऐसा करना, इसलिए दुर्भाग्य से परीक्षण नहीं किया गया है:

 public Type1 { [Key] public int ID { get; set; } [ForeignKey("Type2")] public int? Type2ID { get; set; } public virtual Type2 Type2 { get; set; } } public Type2 { [Key] public int ID { get; set; } [ForeignKey("Type1")] public int? Type1ID { get; set; } public virtual Type1 Type1 { get; set; } } 

एक अलग रूप में, इकाई पर एक स्पष्ट विदेशी कुंजी का प्रयोग करके यह परीक्षण के लिए अनुमति देता है कि क्या डेटाबेस को कॉल करने के बिना एक संबद्ध वस्तु है जैसे IEnumerable<Type1>.Where(t => t.Type2ID.HasValue) Type1 सभी ऑब्जेक्ट्स वापस करेगा जो कि जुड़े Type1 है! कुछ और विवरण के लिए यह प्रश्न देखें।