2012-12-19 11 views
7

के साथ संबंध रहा संपर्क और फोन के बीच एक-से-अनेक uni-दिशात्मक संबंध इस तरह परिभाषित किया गया है निम्न कार्य करें:यूनी-दिशात्मक एक-से-कई कोड पहले

someContact.Phones.Remove(somePhone); 

और जब मैं context.SaveChanges() फोन करने की कोशिश मैं एक अपवाद है क्योंकि रिश्ते आवश्यक के रूप में परिभाषित किया गया है मिल (। उदाहरण के लिए एक फोन संपर्क के बिना नहीं हो सकता है)।
मैं SaveChanges() पर कॉल करने से पहले DbSet<Phone>.Remove(Phone) पर कॉल करने की आवश्यकता के बिना फोन में विदेशी कुंजी या नेविगेशन प्रॉपर्टी का उपयोग किए बिना इसे कैसे हल कर सकता हूं?

+1

तुम सिर्फ एक 'RemovePhone नहीं जोड़ सकते हैं()' -Method संपर्क करने के लिए? और आप क्या करना चाहते हैं यदि श्रीमान और श्रीमती स्मिथ दोनों एक ही फोन के साथ आपके डेटाबेस में हैं और केवल श्री स्मिथ ने अपना खाता हटा दिया है? – efkah

+0

क्या आप चाहते हैं कि फोन डेटाबेस से हटाया जाए या संपर्क से अनलिंक किया गया हो? ईएफ को यह कैसे पता होना चाहिए कि अगर आप इसे और संपर्कों के बीच संबंध परिभाषित नहीं करते हैं तो फोन हटा दिया जाना चाहिए? – lintmouse

उत्तर

1

आप मूल रूप से, अपने खुद के सवाल का जवाब के रूप में दो चीजें आप का वर्णन अलग कर रहे हैं:

  1. को एफई के लिए वस्तु

एक चतुर तरीका नहीं हो सकता है लिंक हटाने का वस्तु को हटाया जा रहा ऐसा करें, लेकिन अन्य ने एक ही प्रश्न पूछा है और आपके द्वारा बताए गए उत्तर के साथ प्रस्तुत किया गया है:

उदा। EF 4.1: Removing child object from collection does not delete it - why?

0

मैथ्यू एक ही चरण में वर्णित दोनों स्टेप करने का एक तरीका है। इसके लिए आपके मॉडल में थोड़ा बदलाव की आवश्यकता है - आपको Phone इकाई में विदेशी कुंजी जोड़नी होगी और एक समग्र कुंजी बनाएं जिसमें PhoneId और ContactId दोनों शामिल हों।

यह Phone वर्ग का उदाहरण Contact वर्ग के उदाहरण से जुड़ा हुआ है। इन सेटिंग्स के साथ, जब आप someContact.Phones.Remove(somePhone); से संपर्क हटाते हैं, तो ईएफ फोन को डीबी से हटा देता है, क्योंकि यह जानता है कि फ़ोन उस विशेष संपर्क के कनेक्शन के बिना मौजूद नहीं हो सकता है।

मॉडल:

public class Contact { 
    public int ContactId { get; set; } 
    public virtual ICollection<Phone> Phones { get; set; } 
} 

public class Phone { 
    public int PhoneId { get; set; } 
    public int ContactId { get; set; } 
    public string PhoneNumber { get; set; } 
} 

विन्यास:

modelBuilder.Entity<Contact>() 
    .HasMany(o => o.Phones) 
    .WithRequired() 
    .HasForeignKey(f => f.ContactId) 
    .WillCascadeOnDelete(true); 

modelBuilder.Entity<Phone>() 
    .HasKey(o => new { o.PhoneId, o.ContactId }); 
+0

आप समाधान चालाक है, लेकिन यह मेरे बाधाओं में से एक बाधा का उल्लंघन करता है, इसलिए यह हैक है, और मैं एक ही विचार करने के लिए अन्य हैक्स ढूंढ सकता हूं। मैं जानना चाहता था कि यह विदेशी या द्वि-दिशात्मक नेविगेशन गुण प्रदान किए बिना किया जा सकता है और मुझे लगता है (कम से कम ईएफ के वर्तमान संस्करण में) यह नहीं किया जा सकता है। –

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