2016-03-30 10 views
6

काम नहीं करता है, मैं एक यूनिडायरेक्शनल को एक रिश्ते को लागू करना चाहता हूं; हालांकि कैस्केड डिलीट पर काम नहीं करता है।यूनिडायरेक्शनल वन टू रिलेशन यूनिट फ्रेमवर्क, कैस्केड डिलीट

मैं निम्नलिखित श्रेणियां होती हैं:

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Address Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Street { get; set; } 
    //I don't want the StudentId foreign key or the property of Student class here 
} 

मेरी प्रसंग कक्षा में, मैं इस तरह के रिश्ते मानचित्रण हूँ:, student

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Student>() 
     .HasRequired(s => s.Address) 
     .WithOptional() 
     .Map(m => m.MapKey("Address_Id")) 
     .WillCascadeOnDelete(); 
} 

किसी कारण के लिए, यह address जब हटाने से नहीं कर रहा है ऑब्जेक्ट हटा दिया गया है।

इसके अलावा, मैं भी इस तरह Student कक्षा में विदेशी कुंजी संपत्ति (यानी AddressId) जोड़ना चाहते हैं:

[ForeignKey("Address")] 
[Column("Address_Id")] 
public string AddressId { get; set; } 

हालांकि, मैं इस त्रुटि जब मैं एक नया माइग्रेशन जोड़ने की कोशिश मिलती है:

पता_आईडी: नाम: एक प्रकार में प्रत्येक संपत्ति का नाम अद्वितीय होना चाहिए। संपत्ति का नाम 'पता_आईडी' पहले से ही परिभाषित किया गया है।

मेरा मानना ​​है कि कि मैं चीजों को मिश्रण कर रहा हूँ (MapKey साथ और AddressId की विशेषताएँ)। हालांकि, मुझे नहीं पता कि इसे कैसे ठीक किया जाए।


मैं this SO question और this article माध्यम से चला गया; हालांकि, अब तक कोई भाग्य नहीं है।

DotNetFiddle से लिंक करें। यह काम नहीं करेगा क्योंकि कोई डेटाबेस नहीं है।

उत्तर

3

किसी कारण से, address को हटा नहीं रहा है, student ऑब्जेक्ट हटा दिया गया है।

आपके द्वारा निर्धारित रिश्ते के लिए यह सामान्य व्यवहार है। यह डेटा एनोटेशन या धाराप्रवाह विन्यास का मामला नहीं है। यदि आपके पास अलग-अलग उम्मीदें हैं, तो आप बेहतर ढंग से अपने मॉडल की समीक्षा करेंगे।

हर रिश्ते एक एक तरफ प्रिंसिपल कहा जाता है और यह एक और पक्ष निर्भर कहा जाता है। प्रिंसिपल पक्ष (ए.के.ए.मास्टर, प्राथमिक) संदर्भित किया जा रहा है। निर्भर पक्ष (ए.के.ए. विवरण, माध्यमिक) वह है जो प्रिंसिपल का संदर्भ दे रहा है। विदेशी कुंजी पर निर्भर पक्ष पर रखी जाती है और संबंध optional पर होने पर हमेशा मौजूदा प्रिंसिपल या null पर इंगित करना चाहिए। सभी निर्भर रिकॉर्ड को हटाकर काम करता है जब प्रिंसिपल रिकॉर्ड हटा दिया जाता है।

जैसा कि में बताया गया है कि कोड कैसे पहले एसोसिएशन में प्रधानाचार्य और निर्भर अंत निर्धारित करता है? आपके द्वारा उल्लिखित article का अनुभाग, ईएफ हमेशा required पक्ष प्रिंसिपल का उपयोग करता है और आपको केवल required दोनों को चुनने की अनुमति देता है।

जो कुछ कहा जा रहा है, उसके साथ देखते हैं कि आपके पास क्या है।

Addressrequired, Studentoptional है। इसके अलावा आप Student में एफके रखना चाहते हैं, यानी Student संदर्भ Address

सब मतलब है कि आपके रिश्ते में, Addressप्रिंसिपल है और Studentनिर्भर है। जिसका अर्थ है Address w/o Student इसका संदर्भ दे सकता है। यदि cascade delete चालू है (जैसा आपने किया था), Address को हटाकर Student हटा देगा, विपरीत नहीं।

मुझे लगता है कि यह सब समझा जाना चाहिए कि यह अब जिस तरह से काम कर रहा है, और यह कि कोई विशेषता या कॉन्फ़िगरेशन आप जो मांग रहे हैं उसे प्राप्त करने में सहायता कर सकता है। आप इसे दूसरे तरीके से चाहते हैं, एक ही लेख (और एक ही श्रृंखला से संबंधित) संबंध या तो साझा प्राथमिक कुंजी एसोसिएशन या विदेशी कुंजी एसोसिएशन उपयोग करने के लिए पता पक्ष में कॉन्फ़िगर करने के तरीके बताते हैं। चाहे यह यूनिडायरेक्शनल या बिडरेक्शनल है, इस समस्या में बिल्कुल कुछ भी नहीं है - लेख में Should We Make the Associations Bidirectional? अनुभाग देखें।

+0

धन्यवाद। – Dumbledore

3

आप विदेशी कुंजी इस तरह होना चाहिए:

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [ForeignKey("AddressId")] 
    public Address Address { get; set; }   
    [Column("Address_Id")] 
    public int AddressId { get; set; } 
} 

अपने धाराप्रवाह मानचित्रण में आप सिर्फ जरूरत है:

modelBuilder.Entity<Student>() 
    .HasRequired(s => s.Address) 
    .WillCascadeOnDelete(true); 

या आप झरना मजबूर कर सकते हैं एक टिप्पणी के साथ हटा दें:

[Required] 
[ForeignKey("AddressId")] 
public Address Address { get; set; } 

अब अपना डेटाबेस अपडेट करें और आपकी मैपिंग बी ई सही और हटा देना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद। मुझे माफ कर दो; हालांकि, धाराप्रवाह मानचित्रण काम नहीं कर रहा है। 'आवश्यक' एनोटेशन काम करता है। हालांकि, ईएफ 'पता' ऑब्जेक्ट लोड नहीं करता है जब तक कि 'वर्चुअल' कीवर्ड को संपत्ति में जोड़ा नहीं जाता है। क्या ऐसा व्यवहार करना चाहिए? क्या 'वर्चुअल' कीवर्ड केवल आलसी लोडिंग में मदद करता है जब' आईसीओलेक्शन 'को पुनर्प्राप्त किया जाना चाहिए? – Dumbledore

+0

मुझे खेद है, मैंने अभी अपने डेटाबेस में देखा है। कैस्केड डिलीट या तो काम नहीं करता है। – Dumbledore

+1

वर्चुअल कीवर्ड आलसी संबंधित इकाई को लोड करता है ताकि पैरेंट ऑब्जेक्ट लोड होने पर इकाई लोड हो जाए। उत्सुक लोडिंग तब होती है जब आप line पर इकाई क्वेरी में शामिल() जोड़ते हैं, इसलिए 2 विकल्प होते हैं। –

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