पर धीमी कार्यक्षमता के कारण मैं इस प्रश्न में विस्तार की कमी के लिए क्षमा चाहता हूं - पहली चीज़ जो मुझे मदद चाहिए, यह जानना है कि अधिक जानकारी कहां देखना है।सी # इकाई फ्रेमवर्क 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 - मुझे इसके बारे में पता नहीं था। -1 लागत के लिए, $ 305 ?? वाह –
अपना पॉइंट # 2 पुन: करें। मैं कारण ढूंढने की कोशिश कर रहा हूं - शायद यह समस्या है जहां समस्या है। मुझे पता चला कि नेविगेशन प्रॉपर्टी का सही इस्तेमाल नहीं किया जा रहा था, लेकिन इसे ठीक करने से चयन * क्वेरी –
को नहीं हटाया गया है, मैंने पाया है कि यह काम करने तक सामान को टिप्पणी करके कहां होता है। लेकिन मैं कोड से नहीं देख सकता क्यों ईएफ चुनिंदा क्वेरी जारी करता है। –