2011-06-06 10 views
7

ईएफ 4.1 आपके उदाहरण बनाते समय रिवर्स एसोसिएशन सिंक्रनाइज़ करता है। क्या इस व्यवहार के लिए कोई दस्तावेज या सर्वोत्तम अभ्यास मार्गदर्शन उपलब्ध है?इकाई फ्रेमवर्क में रिवर्स एसोसिएशन को सिंक्रनाइज़ करने के लिए मार्गदर्शन 4.1

क्या मैं रिवर्स संघ सिंक्रनाइज़ करके मतलब है कि दिए गए है:

public class Blog 
{ 
    public Blog() { Posts = new List<Blog>(); } 
    public int Id { get; set; } 
    public ICollection<Post> Posts { get; private set; } 
} 

public class Post 
{ 
    public Blog Blog { get; set; } 
    public int Id { get; set; } 
} 

तो निम्न पंक्ति के बाद पोस्ट यह ब्लॉग संपत्ति सेट है होगा।

var blog = new Blog(); 
context.Blogs.Add(blog); 
blog.Posts.Add(new Post()); 

उत्तर

8

मेरा मानना ​​है कि - लेकिन मुझे यकीन नहीं कर रहा हूँ - "रिवर्स संघ को सिंक्रनाइज़" के साथ आप इकाई की रूपरेखा में एक सुविधा है जो रिश्ता कहा जाता फिक्स-अप या रिश्ता स्पैन और आवंटित करने के लिए जिम्मेदार है मतलब ऑब्जेक्ट कॉन्टेक्स्ट में ऑब्जेक्ट्स के बीच स्वचालित रूप से नेविगेशन गुण। यह ईएफ 4.1 के लिए विशिष्ट नहीं है लेकिन पुराने संस्करणों के लिए भी मौजूद है।

मैं इस सुविधा के लिए एक व्यापक प्रलेखन पता नहीं है लेकिन यहां पर कुछ संसाधनों जो थोड़ा अधिक जानकारी दे सकते हैं - विशेष रूप से एक दूसरे:

संपादित

मैं संबंध अवधि और उसके सभी प्रभावों के लिए एक व्यापक स्पष्टीकरण देने में सक्षम नहीं हूँ।

answer you have linked in the comment मोर्तेज़ा में संस्थाओं के बीच एक अंतर जो एफई 4.0 में EntityObject (केवल ObjectContext से प्राप्त कर रहे, के साथ संभव नहीं बनाता है: लेकिन मुझे लगता है मैं क्या कहते हैं कुछ उदाहरण हैं, जहां मैं सुरक्षित है कि यह पूरी तरह से गलत नहीं है महसूस देने के लिए कोशिश कर सकते हैं ईएफ 4.1 में DbContext) और पीओसीओ (ObjectContext और DbContext के साथ संभव)।

यदि आपके पास पीओसीओ है तो किसी अन्य ऑब्जेक्ट के नेविगेशन संग्रह में एक नया ऑब्जेक्ट जोड़ना जो पहले ही संदर्भ में लोड हो चुका है संदर्भ में नई ऑब्जेक्ट को संलग्न नहीं करेगा। यह आश्चर्य की बात नहीं है क्योंकि पीओसीओ हैं, ठीक है ..., पीओसीओ, जिसका मतलब है कि वे ईएफ संदर्भ के बारे में कुछ भी नहीं जानते हैं। एक नेविगेशन संग्रह में ऑब्जेक्ट जोड़ना वास्तव में List<T>.Add(...) जैसे कुछ भी नहीं है। यह जेनेरिक Add विधि ईएफ संदर्भ पर कोई भी संचालन नहीं करती है।

यह EntityObject और EntityCollection के साथ एक और स्थिति है, दोनों में आंतरिक रूप से संदर्भ के संदर्भ हैं और इसलिए जब आप संग्रह में जोड़ते हैं तो तत्काल संदर्भ से संलग्न हो सकते हैं। इस विचार से

एक निष्कर्ष यह है कि अपने प्रश्न में पिछले कोड उदाहरण नहीं वास्तव में Blog संपत्ति Post में स्थापित करेगा जब आप Pocos का उपयोग करें।लेकिन: आपको DetectChanges या SaveChanges (जिसे DetectChanges आंतरिक रूप से कॉल किया गया है) के बाद सेट किया जाएगा। इस स्थिति में DetectChanges (जो शायद एक बहुत ही जटिल विधि है) संदर्भ में दिखता है कि कौन सी वस्तुएं हैं (इसे Blog पैरेंट ऑब्जेक्ट मिलेगा) और फिर पूरे ऑब्जेक्ट ग्राफ़ (Posts हमारे मामले में संग्रह) के माध्यम से चलता है और जांचता है कि क्या ग्राफ में अन्य ऑब्जेक्ट्स (Post ऑब्जेक्ट्स) संदर्भ में भी हैं। यदि नहीं - और यह आपके उदाहरण में मामला है - यह उन्हें Added स्थिति में संदर्भ में संलग्न करेगा और - अब रिश्ते अवधि अब खेल में आता है - ऑब्जेक्ट ग्राफ़ में नेविगेशन गुणों को भी ठीक करें।

एक और स्थिति जहां संबंध अवधि भी पीओसीओ के साथ कार्य करती है जब आप संदर्भ में वस्तुओं को लोड करते हैं।

उदाहरण के लिए: आप के साथ आईडी = एक्स एक Blog और आईडी के साथ एक Post = y जो डेटाबेस तो इस कोड में इस Blog के अंतर्गत आता है ... है, तो

var blog = context.Blogs.Find(x); // no eager loading of the Posts collection! 
var post = context.Posts.Find(y); // no eager loading of the Blog property! 

स्वचालित रूप से नेविगेशन का निर्माण होगा प्रत्येक ऑब्जेक्ट में गुण, PostsBlog का संग्रह अचानक पोस्ट और BlogPost में संपत्ति ब्लॉग को संदर्भित करेगा। यह रिलेशनशिप फिक्स-अप इस तथ्य पर निर्भर करता है कि वस्तुओं को संदर्भ में वास्तव में लोड किया जाता है। आप AsNoTracking उदाहरण के लिए का उपयोग करके इस को दबाने के हैं ...

var blog = context.Blogs.AsNoTracking().Where(b => b.Id == x).Single(); 
var post = context.Posts.AsNoTracking().Where(p => p.Id == y).Single(); 

... संबंध अवधि काम नहीं करता है और नेविगेशन गुण null रहना होगा।

एक आखिरी नोट: रिलेशनशिप अवधि - उपर्युक्त उदाहरण में - केवल तभी काम करता है जब कम से कम एक छोर पर आक्रमण में 0...1 (एक-से-एक या एक से कई संगठन) की कार्डिनालिटी हो। यह कई से कई संगठनों के लिए कभी काम नहीं करता है। हाल ही में इस पर चर्चा की गई थी (ईएफ 4.1 के साथ): EF 4.1 loading filtered child collections not working for many-to-many

+0

धन्यवाद स्लैमा, मैंने पहले रिलेशनशिप अवधि के बारे में नहीं सुना था। इससे इस व्यवहार के बारे में सामग्री खोजने में बहुत मदद मिली है। अपने लिंक पढ़ने और अन्य जानकारी के लिए खोज करने के बाद, मैं इस SO उत्तर में आया: http://goo.gl/4j888। मोर्टेजा कह रहा है कि रिलेशनशिप स्पैन कोड-पहले में समान काम नहीं करता है। अनिश्चित ... –

+0

@ सेन Kearon: अब मेरे जवाब में एक संपादन है। (मैं केवल एक संक्षिप्त टिप्पणी लिखना चाहता था, लेकिन यह लंबा और लंबा हो रहा था।) – Slauma

+0

स्लुमा, वापस पाने के लिए और व्यवहार के बारे में इस तरह के एक व्यापक उत्तर के लिए धन्यवाद। –

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