2014-05-08 4 views
39

मैंने सोचा कि WithOptionalDependent का उपयोग कब और WithOptionalPrincipal का उपयोग करने के लिए एक निश्चित उत्तर प्राप्त करने में सहायक हो सकता है। दो कार्यों के लिए सहायता थोड़ा अस्पष्ट है, और मैं खुद को कई स्टैक ओवरफ़्लो उत्तरों और उत्तर देने वाले अन्य साइटों पर उत्तर देने के लिए खुद को महसूस करता हूं ताकि मुझे विश्वास हो कि रिश्ते सही दिशा में जा रहे हैं। रिश्ते के दूसरे पक्ष पर एक नेविगेशन संपत्ति के बिना वैकल्पिक:के साथ वैकल्पिक निरंतर बनाम वैकल्पिक सिद्धांत - परिभाषित उत्तर?

वैकल्पिक होने के लिए रिश्ते को कॉन्फ़िगर करता है:

यहाँ MSDN के बारे में WithOptionalDependent क्या कहते है। इकाई कॉन्फ़िगर किया जा रहा प्रकार निर्भर होगा और प्रिंसिपल में एक विदेशी कुंजी होगी। इकाई प्रकार जो संबंध लक्ष्य रिश्ते में प्रिंसिपल होगा। रिश्ते के दूसरे पक्ष पर एक नेविगेशन संपत्ति के बिना वैकल्पिक:

वैकल्पिक होने के लिए रिश्ते को कॉन्फ़िगर करता है:

और यहाँ यह क्या कहते हैं के बारे में WithOptionalPrincipal है। इकाई कॉन्फ़िगर किया जा रहा प्रकार रिश्ते में प्रिंसिपल होगा। इकाई प्रकार कि संबंध लक्ष्य निर्भर होंगे और प्रिंसिपल के लिए एक विदेशी कुंजी है।

रेखा "इकाई प्रकार कॉन्फ़िगर किया जा रहा है" वह हिस्सा है जो हमेशा मुझे भ्रमित करता है (और मैं दूसरों को मानता हूं)।

इस उदाहरण में:

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int BId { get; set; } 
    [ForeignKey("BId")] 
    public MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 
} 

modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent(); 

"इकाई प्रकार के लिए कॉन्फ़िगर किया जा रहा" है MyEntityA या MyEntityB की चर्चा करते हुए? मुझे लगता है कि यह पूर्व है।

यदि यह सही है, तो आप WithOptionalPrincipal का उपयोग कब करेंगे?

मुझे वास्तव में मेरे कोड उदाहरण में लगता है कि यह वास्तव में WithMany होना चाहिए और न तो वैकल्पिक विकल्पों में से कोई भी होना चाहिए। स्पष्ट रूप से मैं अभी भी उलझन में हूँ!

इन दोनों कार्यों के लिए अधिभार हैं जो नेविगेशन संपत्ति को दूसरी दिशा में लेते हैं। मुझे लगता है कि उन ओवरलोड्स उन उत्तरों को नहीं बदलते हैं, लेकिन अगर मैं गलत हूं तो कृपया मुझे सही करें।

मुझे आशा है कि यह बड़े समुदाय के लिए भी सहायक होगा।

उत्तर

10

exmaple के लिए, नेविगेशन प्रॉपर्टी द्वारा अपने EntityB को संशोधित करने दें और BId नामुमकिन बनाएं (जैसा कि हम वैकल्पिक संबंधों के बारे में बात कर रहे हैं)।

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int? BId { get; set; } 

    [ForeignKey("BId")] 
    public virtual MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual MyEntityA A { get; set; } 
} 

तो हम उपयोग कर सकते हैं:

modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal(); 

MyEntityA है FKMyEntityB है, इसलिए अपने exapmle में आप MyEntityA कॉन्फ़िगर और WithOptionalDependent का उपयोग करें।लेकिन आप MyEntityB -side से कॉन्फ़िगरेशन प्रारंभ कर सकते हैं, तो आपको WithOptionalPrincipal की आवश्यकता है।

4

अपने प्रश्न का उत्तर है: "इकाई प्रकार के लिए कॉन्फ़िगर किया जा रहा" MyEntityA

है यह किस प्रकार HasOptional द्वारा दिया है के लिए

OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType> 

documentation को देखकर निश्चित देखा जा सकता है और जो कहते हैं:

TTargetEntityType

इकाई प्रकार जो संबंध लक्ष्य करता है।

जो वाक्यांशों के लिए अधिक जानकारी मिलती है:

इकाई प्रकार के लिए कॉन्फ़िगर किया जा रहा

इकाई प्रकार उस रिश्ते

तो लक्षित करता है, आपके मामले में आप वापस पाने के HasOptional से

OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB> 

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

इसके विपरीत, WithOptionalPrincipal मतलब यह है कि MyEntityA प्रधानाचार्य और MyEntityB विदेशी कुंजी और नेविगेशन संपत्ति के साथ निर्भर हो जाएगा।

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