2017-04-05 15 views
8

के बाद एक-से-एक मॉडल, दोनों के साथ नेविगेशन गुण के साथ: -ईएफ - साथ-साथ - बाएं बाहरी शामिल हों?

public class Foo 
{ 
    public int Id { get; set; } 

    public virtual Bar Bar { get; set; } 
} 

public class Bar 
{ 
    public int Id { get; set; } 

    public virtual Foo Foo { get; set; } 
} 

फू एक वैकल्पिक बार है।

बार एक आवश्यक Foo है।

मैं बारपर निम्नलिखित मानचित्रण है: -

HasRequired(x => x.Foo) 
     .WithOptional(x => x.Bar) 
     .Map(x => x.MapKey("FooId")); 

कौन सा बार नामित मेज पर विदेशी कुंजी बनाता है 'FooId'।

यह सब, ठीक काम करता है सिवाय इसके कि इसे जब इसकी जरूरत नहीं के साथ एक बार करने के लिए 'वाम बाहरी शामिल' सभी प्रश्नों पर फू के लिए एसक्यूएल उत्पन्न करता है।

SELECT .. 
[Extent2].[Id] AS [Id1] 
FROM [dbo].[Foo] AS [Extent1] 
LEFT OUTER JOIN [dbo].[Bar] AS [Extent2] ON [Extent1].[Id] = [Extent2].[FooId] 

करीब देखकर यह बार की आईडी लौटाता है।

Searching ढेर मैं अधिकांश सुझाव .WithOptional के बजाय .WithMany उपयोग करने के लिए देख सकते हैं, लेकिन मैं नेविगेशन गुण की जरूरत है।

कोई सुझाव?

+0

यदि आप इसके बारे में सोचते हैं, तो वास्तव में 1: 1 जैसी कोई चीज़ नहीं है, जब तक कि आप एक साझा प्राथमिक कुंजी नहीं कर रहे हैं, क्योंकि कुंजी उनकी प्रकृति से अद्वितीय होनी चाहिए। निश्चित रूप से, आप प्रभावी 1: 1 बनाने के लिए 1: * पर एक अनन्य बाधा डाल सकते हैं, लेकिन यह एक प्रकार का "आभासी" 1: 1 है और वास्तविक भौतिक नहीं है।ईएफ इस तरह की बाधाओं का समर्थन नहीं करता है, इसलिए यह वास्तव में संभव नहीं है। यही कारण है कि इसमें शामिल है, क्योंकि ईएफ केवल यह मान सकता है कि यह 1 है: * –

उत्तर

4

यह एक-से-एक एफके एसोसिएशन के लिए मानक व्यवहार है और इससे बचा नहीं जा सकता है। Foo इकाई के लिए आंतरिक रूप से एक छिपी हुई (छाया) संपत्ति जैसे int? BarId को बनाए रखने के लिए ईएफ क्या करता है।

एक ही रास्ता LEFT OUTER JOIN रों से छुटकारा और द्विदिश नेविगेशन गुण रखने पाने के लिए यदि आप मूल रूप से हटाने के द्वारा (डिफ़ॉल्ट एफई एक-से-एक मॉडल) Shared Primary Key Association उपयोग करने के लिए बदलते Bar db मॉडल (टेबल) कर सकता है धाराप्रवाह विन्यास से Map कॉल:

HasRequired(x => x.Foo) 
    .WithOptional(x => x.Bar); 

इस मॉडल में Bar तालिका FooId FK भी शामिल होगा नहीं, लेकिन इसके बजाय पी स्तंभ Id कोई और अधिक पहचान होगी और यह भी FK Foo tabl संदर्भित रूप में काम करेगा ई।

यह एफई Foo में एक BarId को बनाए रखने के बाद से यह जानता है कि अगर वहाँ इसी Bar, यह IdFoo.Id रूप में एक ही साथ होगा परवाह नहीं करने के लिए अनुमति देता है।

आप डेटाबेस डिजाइन बदल नहीं सकते हैं, तो आप भाग्य से बाहर हैं - आप LEFT OUTER JOIN रों के साथ या तो रहते हैं, या Foo.Bar नेविगेशन संपत्ति का त्याग और दिशाहीन एक-से-कई आप के रूप में पहले से ही के रूप में संबंध को कॉन्फिगर करना उल्लेख किया।

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