2009-10-02 14 views
11

मैं इकाई ढांचे का उपयोग करने के लिए अपने आवेदन को फिर से लिख रहा हूं। जो मैं उलझन में हूं, वह कोड है जो मैं लिख रहा हूं ऐसा लगता है कि यह अनावश्यक ट्रिप को एसक्यूएल सर्वर बना रहा है। उदाहरण के लिए, मेरे पास SO के समान प्रश्नोत्तर उत्तर साइट है। जब मैं किसी प्रश्न का उत्तर जोड़ता हूं - यहां मैं कोड का उपयोग करता हूं:एंटिटी फ्रेमवर्क डाटाबेस में इतने सारे राउंडट्रिप्स क्यों करता है?

var qu = context.question.where(c => c.questionID == 11).First(); //Database call here 
var answer = new answer(); 
answer.title = "title here"; 
answer.desc = "desc here"; 
answer.question = qu; 
context.SaveChanges(); //Database call here 

उपरोक्त कोड में 2 डेटाबेस कॉल सही हैं? यदि हां, तो मैं सीधे एक प्रश्न का उत्तर क्यों नहीं जोड़ सकता? जैसे कि

var ans = answer.Createanswer (0, "title here", "desc here", questionID) 
context.SaveChanges(); 

क्या सभी डेटाबेस कॉल को कम करने का कोई तरीका है?

+1

अच्छा प्रश्न ... –

उत्तर

11

AlexJ एफई डिजाइनरों http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

इसके अलावा यह सब "अनुकूलन" पर दायरे में आता है अक्सर के रूप में सरल नहीं के रूप में ऐसा लगता है जो

सरल दृष्टिकोण का उपयोग में से एक ने समझाया , एसक्यूएल एफके (प्रश्न) को लोड करने और नतीजे को कैश करने के लिए एक पठन ऑपरेशन करेगा, और उसके बाद एक पृथक कमांड पर एक डालने वाला ऑपरेशन जो कैश किए गए एफके परिणाम

संलग्न एफके विधि का उपयोग करने के परिणामस्वरूप अभी भी परिणाम देगा सर्वर एफके के लिए एक पठन ऑपरेशन कर रहा है, इसका मतलब सिर्फ SQL सर्वर के लिए एक कम राउंड ट्रिप है। तो प्रश्न बन जाता है - समय के साथ बढ़ती कोड जटिलता की तुलना में एक दौर यात्रा अधिक महंगा है?

आवेदन और SQL सर्वर एक ही मशीन पर हैं, तो इस भूमि के ऊपर,

भी बहुत छोटा है, तो FK एक बड़े या विस्तृत मेज पर एक संकुल अनुक्रमणिका आईओ भूमि के ऊपर काफी अधिक है, तो की तुलना में यह है हो सकता है बस FK मूल्य पर एक अलग मानक सूचकांक - यह सोचते हैं कि क्वेरी अनुकूलक स्पष्ट से बचने के लिए :-)

-3

यह किया जा सकता है, लेकिन यह .NET 3.5 में बेहद दर्दनाक है। उन्होंने .NET 4.0 में इसे बहुत आसान बना दिया है।

8

आपको संबंध स्थापित करने के लिए वास्तव में प्रश्न लोड करने की आवश्यकता नहीं है। इसके बजाय आप केवल EntityReference

उदा।

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.EntityKey 
    = new EntityKey("MyContextName.Question", "Id", questionId); 

मैं व्यक्तिगत रूप से

public static void SetEntityKey<T>(this EntityReference value, int id) 
{ 
    value.EntityKey = new EntityKey("ContextName." + typeof(T).Name, "Id", id); 
} 

इकाई कुंजी की स्थापना तो यह इस तरह के बजाय लगेगा के लिए एक विस्तार विधि का उपयोग करें।

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.SetEntityKey<Question>(questionId); 
+0

आप उपयोग नहीं कर सकते 'इस EntityReference ' सही ढंग से काम कर रहा है जब SetEntityKey बुला? – devio

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