2011-04-05 17 views
9

पर धीमी कार्यक्षमता के कारण मैं इस प्रश्न में विस्तार की कमी के लिए क्षमा चाहता हूं - पहली चीज़ जो मुझे मदद चाहिए, यह जानना है कि अधिक जानकारी कहां देखना है।सी # इकाई फ्रेमवर्क 4 नेविगेशन गुणों को

मैं जाहिरा तौर पर खराब प्रदर्शन के कारण जब बदलाव करने से enity ढांचे 4 नेविगेशन गुणों के साथ एक समस्या है:

this.ObjectContext.SaveChanges(); 

30+ सेकंड ले रही है जब नेविगेशन गुण (प्राप्तियां तालिका) में से एक (8000 पंक्तियों के आसपास होता है जो बहुत कुछ नहीं है, तो ठीक होना चाहिए)।

मैं एसक्यूएल प्रोफाइलर का इस्तेमाल किया है और कहा कि एफई प्राप्तियों से एक का चयन जारी करता है * और यह बहुत धीमी है कि देख सकते हैं:

exec sp_executesql N'SELECT 
[Extent1].[Id] AS [Id], 
// full field list cut for brevity 
FROM [dbo].[Receipts] AS [Extent1] 
WHERE [Extent1].[WarehouseId] = @EntityKeyValue1', 
N'@EntityKeyValue1 int',@EntityKeyValue1=1 

फिलहाल मैं भी नहीं देख सकते क्यों यह करने की जरूरत है ObjectContext.SaveChanges() को कॉल करते समय इस तालिका से सभी पंक्तियों का चयन करें।

इसे इस तालिका में 1 पंक्ति डालने की आवश्यकता है, लेकिन यह समझा नहीं जाता है कि यह पहले क्यों चयन करता है - और यह स्पष्ट नहीं करता कि यह चयन इतना लंबा क्यों लगता है (वही क्वेरी < क्वेरी में 1 सेकंड लेती है प्रबंधक)

तो मेरे सवाल अभी - मैं वास्तव में नहीं जानता कि क्या समस्या अभी तक है - है:

  • कहाँ/मैं इस समस्या के बारे में अधिक जानकारी के लिए कैसे देख सकते हैं? मैं ऑब्जेक्ट कॉन्टेक्स्ट। डेव चेंज() में डीबग नहीं कर सकता, इसलिए मुझे नहीं पता कि इसके अंदर क्या हो रहा है।
  • ईएफ रसीदों से * चुनने का प्रयास क्यों करेगा?
  • यह इतना धीमा क्यों है? ठीक उसी क्वेरी की नकल की + क्वेरी प्रबंधक में चिपकाया लगभग तत्काल है

संपादित करें:

मैंने पुष्टि की है कि यह रसीद कोड है कि इस विधि के लिए कॉल बाहर टिप्पणी करके धीमी है:

private void AddReceipt(PurchaseInvoice invoice, 
           PurchaseInvoiceLine invoiceLine) 
    { 
     if (invoice != null && invoiceLine != null) 
     { 
      Product product = invoiceLine.Product; 
      if (product != null) 
      { 
       Receipt receipt = new Receipt{ foo = bar }; 
       WarehouseDetail detail = new WarehouseDetail{ foo = bar }; 
       receipt.WarehouseDetails.Add(detail); 
       invoice.Receipts.Add(receipt); 
      } 
     } 
    } 

लेकिन मैं अभी भी नहीं देख सकता कि यह ईएफ को उस चुनिंदा * क्वेरी को जारी करने का कारण क्यों बनता है।

मेरा मानना ​​है कि यह invoice.Receipts.Add(receipt) के कारण आलसी लोडिंग समस्या हो सकती है। क्योंकि उस लाइन चालान से पहले। रसीदें खाली हैं, और क्रम में। रसीदों में जोड़ें, इसे पहले संग्रह लोड करना होगा। लेकिन यह स्पष्ट नहीं करता है कि यह क्यों warehouseId = 1 द्वारा चयन किया जा रहा है, जब इसे invoiceId द्वारा चुना जाना चाहिए।

संपादित करें 2:

मैं प्रत्यक्ष SQL कमांड के साथ इस पद्धति में एफई कोड की जगह "निर्धारित" है समस्या। यह एक अच्छा विचार नहीं है - मुझे एसक्यूएल फेंकना नहीं चाहिए जब मुझे अन्यथा पूरी तरह से अच्छा ओआरएम मिल गया हो। लेकिन अभी मैं अभी भी समझ में नहीं आता क्यों एफई का चयन करें * क्वेरी

private void AddReceipt(PurchaseInvoice invoice, 
           PurchaseInvoiceLine invoiceLine) 
    { 
     if (invoice != null && invoiceLine != null) 
     { 
      Product product = invoiceLine.Product; 
      if (product != null) 
      { 
       Receipt receipt = new Receipt{ foo = bar }; 
       WarehouseDetail detail = new WarehouseDetail{ foo = bar }; 
       int id = SqlHelper.AddWarehouseDetail(detail); 
       receipt.WarehouseDetailId = id; 
       SqlHelper.AddReceipt(receipt); 
      } 
     } 
    } 

उत्तर

1

चल रहा था के बाद से यह एक डालने है, यह मूल्य वापस का चयन करके और वस्तु repopulating करके अपने वस्तु ताज़ा करता है,।अब मुझे आपके प्रश्नों का है कि आप बाहर रखी उत्तर दे:

  1. आप SaveChanges() के बजाय डिबग करने के लिए की जरूरत नहीं होनी चाहिए, क्या आप शायद यह देखने वैसे भी खास मतलब नहीं होता।

  2. यह वास्तव में select * from Receipts नहीं कर रहा है। यह select * from Receipts where WarehouseId = 1 कर रहा है। तो कुछ कारणों से आप ऑब्जेक्ट के लिए वेयरहाउस के लिए सभी रसीदें खींच रहे हैं।

  3. यह इतनी सारी चीजों पर निर्भर हो सकता है कि आप वास्तव में इसमें शामिल नहीं हो सकते हैं। लेकिन शुरू करने के लिए एक जगह है अपने ऐप बॉक्स और अपने डीबी बॉक्स के बीच पिंग दर की जांच करना। यह भी जांचें कि राम डीबी बॉक्स पर भरा नहीं है। यही वह जगह है जहां मैं शुरू करूंगा, और जो आप वर्णन कर रहे हैं उसके लिए यह सामान्य समस्या है।

ईएफ डीबग करने के लिए एक अच्छा उपकरण ईएफ प्रोफाइलर है। http://efprof.com यह आपको SQL प्रोफाइलर से अधिक की सहायता करने में मदद करेगा।

+0

+1 - मुझे इसके बारे में पता नहीं था। -1 लागत के लिए, $ 305 ?? वाह –

+0

अपना पॉइंट # 2 पुन: करें। मैं कारण ढूंढने की कोशिश कर रहा हूं - शायद यह समस्या है जहां समस्या है। मुझे पता चला कि नेविगेशन प्रॉपर्टी का सही इस्तेमाल नहीं किया जा रहा था, लेकिन इसे ठीक करने से चयन * क्वेरी –

+0

को नहीं हटाया गया है, मैंने पाया है कि यह काम करने तक सामान को टिप्पणी करके कहां होता है। लेकिन मैं कोड से नहीं देख सकता क्यों ईएफ चुनिंदा क्वेरी जारी करता है। –

1

आप अपने "वेयरहाउस" इकाई पर "नेविगेशन संपत्ति" के साथ जारी हैं। इस नेविगेशन संपत्ति को हटा दें। रिश्ते अभी भी वहां रहेगा, लेकिन जब आप रसीद इकाई बनाते हैं तो वह उस गोदाम के साथ सभी रसीदों से पूछताछ नहीं करेगा। मेरे पास एक ही समस्या थी और इसने मेरा मुद्दा हल किया।

+0

क्या आप विस्तृत कर सकते हैं? यह समस्या अभी भी अनसुलझा है (इसमें प्रत्यक्ष एसक्यूएल डालने कथन का उपयोग करके "फिक्स" लागू किया गया है)। मेरे सभी पीओसीओ वर्ग स्वत: उत्पन्न होते हैं, इसलिए उनमें प्रत्येक एफके रिश्ते के लिए एक नेविगेशन प्रॉपर्टी होती है। क्या आपके पास एक पृष्ठ पर एक यूआरएल है जो नेविगेशन गुणों को हटाने का वर्णन करता है? (उदाहरण के लिए मैं फिर कैसे रसीद पाता हूं। वेयरहाउस तब होता है जब मेरे पास संपत्ति नहीं है)। धन्यवाद –

0

क्या आपके पास आलसी लोडिंग चालू है? यदि ऐसा है तो आप संबंधित नेविगेशन गुणों तक पहुंचने पर WarehouseDetails और Receipts टेबल के लिए क्वेरी आग लगेंगे। मैं हमेशा यह सुनिश्चित करता हूं कि आलसी लोडिंग बंद हो गई है ताकि मैं अनजाने में आग की क्वेरी न कर सकूं। Efprof.com का सुझाव देने के लिए

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