6

का उपयोग कर के संदर्भ के साथ सिंक में विदेशी कुंजी रखना चाहिए मैं एफई कोड पहले Pocos साथ प्रयोग पर उदाहरण के एक बहुत देखते हैं कि कुछ इस तरह बताते हैं:मैं जब Pocos

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

अब, Blog संपत्ति को देखो। यह इस के बजाय की तरह नहीं होना चाहिए:

private Blog blog; 
public virtual Blog Blog 
{ 
    get 
    { 
     return blog; 
    } 
    set 
    { 
     blog = value; 
     if (blog != null) 
     { 
      BlogId = blog.BlogId; 
     } 
    } 
} 

मेरा मतलब है, के बाद से आप पहले से ही कर रहे हैं अपने मॉडल विदेशी कुंजी के साथ "प्रदूषण", नहीं आप कम से कम यह सिंक में संदर्भ के साथ रखना चाहिए? या आपको डेटा पढ़ने पर BlogId पर भरोसा नहीं करना चाहिए (उदाहरण के लिए। जैसे आप जानना चाहते हैं कि कोई विशिष्ट BlogId किसी सूची में है)। या शायद DbContext पर एक जादू संपत्ति है (जैसे KeepForeingKeysPropertiesSyncronizedWithReferences) जो कि मेरे लिए है और मैं अकेला दुखद प्रोग्रामर हूं जो इसके बारे में चिंतित है? या मैं पागल हूँ? (यह भी, मेरे गरीब अंग्रेजी के लिए खेद)

संपादित करें कि के लिए खेद है - यह वास्तव में एक बेवकूफ सवाल था। स्टीफन सही है, ईएफ वास्तव में आपके लिए यह करता है। मुझे यह नहीं देखा गया था क्योंकि जिन संदर्भों को मैं पास कर रहा था उन्हें AsNoTracking() से लोड किया गया था। केवल इस स्थिति में आपके पास आईडी के साथ संदर्भ होगा और फोरिंग कुंजी फ़ील्ड 0 होगा। जब तक आप संदर्भ पर पहले से ही एक संदर्भ पास करते हैं, तो इसे काम करना चाहिए।

+1

एफई के बारे में पता नहीं है इसके किया है, लेकिन आप NHibernate इस्तेमाल किया आप BlogId संपत्ति में बिल्कुल भी नहीं डाल होता था। – erikkallen

+0

मुझे लगता है कि BlogId का उपयोग करने की संभावना होने पर यह अच्छा है, इसलिए मुझे ब्लॉग संदर्भ रखने की आवश्यकता नहीं है और फिर भी एसोसिएशन को बचा सकता है। मैं बस इसे सिंक्रनाइज़ करने के बारे में उलझन में हूं - मेरे लिए यह करने के लिए स्पष्ट चीज की तरह दिखता है लेकिन मैंने कभी ऐसा नहीं देखा है, तो शायद मैं गलत हूं: / – user1526627

उत्तर

1

आपको यह करने की आवश्यकता नहीं है, ईएफ यह आपके लिए करता है।
यदि आप स्वतंत्र एसोसिएशन संपत्ति सेट करते हैं, तो ईएफ आपके परिवर्तन को प्रतिबिंबित करने के लिए विदेशी कुंजी संपत्ति को सिंक्रनाइज़ करेगा और इसके विपरीत। यह तुरंत नहीं होता है, आपको तुरंत याद दिलाता है, मुझे लगता है कि यह SaveChanges को कॉल करने के बाद होता है लेकिन मुझे यकीन नहीं है।
यदि आप जानना चाहते हैं कि कुछ लोग विदेशी कुंजी संपत्ति का उपयोग क्यों करते हैं: यह वेब ऐप्स जैसे अलग-अलग ऐप्स में अधिक सुविधाजनक है। जब आपको अपने ऐप को स्केल करने की आवश्यकता होती है, तो यह प्रदर्शन को बेहतर बनाने में भी मदद कर सकती है (इसे हाल ही में एमएस ब्लॉग पोस्ट में पढ़ें)।
मूल रूप से, यदि आप मिश्रण और मिलान कर रहे हैं तो आपको केवल यह करने की आवश्यकता है; जब एक विधि में आप स्वतंत्र एसोसिएशन संपत्ति का उपयोग कर रहे हैं और दूसरे में आप विदेशी कुंजी संपत्ति का उपयोग कर रहे हैं।

0

डाटाबेस पहला कोड जेनरेट किया गया।

ऐसा प्रतीत होता है कि आप हाँ करते हैं अन्यथा आपको निम्न त्रुटि प्राप्त होगी।

एक रेफेरेंन्शिअल सत्यनिष्ठा बाधा उल्लंघन हुआ: संपत्ति मानों निर्देशात्मक बाधाओं को परिभाषित लगातार प्रिंसिपल और रिश्ते में निर्भर वस्तुओं के बीच नहीं हैं।

सिद्धांत आपका पोस्ट ऑब्जेक्ट है, ब्लॉग ऑब्जेक्ट पर निर्भर है।

जब आप अपने आवंटित संदर्भ मुक्त POCO वापस संदर्भ के लिए संलग्न करने के लिए एफई 4.1 DBContext प्रयास: .. कर

using (TransactionScope scope = new TransactionScope()) 
using (ITAMdbContext db = new ITAMdbContext()) 
{ 
    db.Entry(post).State = System.Data.EntityState.Unchanged; // error here 
    db.Entry(post).State = System.Data.EntityState.Modified; 
    db.SaveChnages(); 

यह त्रुटि द्वारा हल हो गई है

using (TransactionScope scope = new TransactionScope()) 
using (ITAMdbContext db = new ITAMdbContext()) 
{ 
    post.BlogId = post.Blog.BlogId; 
// fix the broken FK value, EF will not do this for 
// you, it does not know if post.BlogId or the post.Blog.BlogId should be chosen. 

    db.Entry(post).State = System.Data.EntityState.Unchanged; 
    db.Entry(post).State = System.Data.EntityState.Modified; 
    db.SaveChnages(); 

अपने तरीके से वैध है यदि आपकी पीओसीओ ऑब्जेक्ट्स ऑटो जनरेट नहीं हैं।

अपरिवर्तित पर पोस्ट सेट करने का कारण यह संशोधित करने के लिए सेट करें क्योंकि पहली प्रविष्टि()।एक वस्तु पर राज्य सेट सभी राज्य वस्तुओं के लिए एक ही राज्य को कैस्केड करेगा! भयानक लेकिन यह काम करने के लिए प्रतीत होता है। फिर जब आप इसे फिर से कॉल करते हैं तो यह केवल पोस्ट ऑब्जेक्ट को संशोधित करता है। यह बाल वस्तुओं को संशोधित या जोड़ा जा रहा है।

संपादित करें: यह नहीं रह गया है की आवश्यकता होती है, के लिए आप