2011-01-09 14 views
5

तो यह पता चला है कि मैं टीपीटी (तालिका प्रति प्रकार) विरासत को लागू करते समय माइक्रोसॉफ्ट के एंटिटी फ्रेमवर्क में मौजूद मौलिक मंजिल की खोज करने वाला अंतिम व्यक्ति हूं।एंटीटी फ्रेमवर्क टेबल प्रति प्रकार प्रदर्शन

3 उप वर्गों के साथ एक प्रोटोटाइप बनाने के बाद, बेस टेबल/कक्षा जिसमें 20+ कॉलम शामिल हैं और ~ 10 कॉलम वाली बाल तालिकाएं, सब कुछ खूबसूरती से काम करता है और मैंने शेष आवेदन पर काम करना जारी रखा है अवधारणा। अब समय 20 अन्य प्रकारों और ओएमजी जोड़ने के लिए आया है, मैंने बस एक साधारण चयन पर उत्पन्न होने वाले एसक्यूएल को देखना शुरू कर दिया है, भले ही मैं केवल बेस क्लास पर फ़ील्ड तक पहुंचने में रूचि रखता हूं।

This page समस्या का एक अद्भुत विवरण है।

किसी टीपीटी और एफई का उपयोग कर उत्पादन में चला गया है, वहाँ किसी भी कामकाज से जुड़े हैं इसका मतलब यह होगा कि मैं नहीं करना होगा: क) TPH (जो सब कुछ के खिलाफ जाता है करने के लिए स्कीमा मैं के साथ प्राप्त करने का प्रयास कन्वर्ट मेरी डीबी डिजाइन - urrrgghh!)? बी) एक और ओआरएम के साथ फिर से लिखना?

जिस तरह से मैं इसे देखता हूं, मुझे ईएफ के भीतर से संग्रहीत प्रक्रिया का संदर्भ जोड़ने में सक्षम होना चाहिए (संभवतः EFExtensions का उपयोग करना) जिसमें टीएसक्यूएल है जो केवल आवश्यक फ़ील्ड का चयन करता है, यहां तक ​​कि ईएफ द्वारा उत्पन्न कोड का उपयोग करना राक्षस यूनियन/एसपी के अंदर शामिल होने के लिए प्रत्येक बार कॉल किए जाने पर एसक्यूएल उत्पन्न होने से रोका जाएगा - ऐसा कुछ नहीं जिसे मैं करना चाहता हूं, लेकिन आपको विचार मिलता है।

मुझे जो हत्यारा मिला है, वह यह है कि जब मैं आधार तालिका से जुड़ी संस्थाओं की एक सूची का चयन कर रहा हूं (लेकिन जिस इकाई को मैं चुन रहा हूं वह उप-वर्ग तालिका नहीं है), और मैं पीके द्वारा फ़िल्टर करना चाहता हूं बेस टेबल का, और मैं .Include("BaseClassTableName") करता हूं ताकि मुझे x=>x.BaseClass.PK == 1 का उपयोग करके फ़िल्टर करने की अनुमति मिल सके और अन्य गुणों तक पहुंच सकें, यह यहां माँ एसक्यूएल पीढ़ी भी करता है।

मैं ईएफ 4 का उपयोग नहीं कर सकता क्योंकि मैं 3.5 एसपी 1 स्थापित के साथ .NET 2.0 रनटाइम तक सीमित हूं।

क्या किसी को भी इस गड़बड़ी से बाहर निकलने का कोई अनुभव मिला है?

+1

मैं पूर्व EF4 के लिए नहीं बोल सकता है, लेकिन उस में बयान "टेबल-पर-प्रकार विरासत 100% है ब्लॉग व्यर्थ। " थोड़ा हास्यास्पद है - कम से कम ईएफ 4 में। इसमें कुछ प्रदर्शन समस्याएं हैं - लेकिन यदि आपके पास 20 उप प्रकार हैं, तो क्या आप वाकई सही डेटाबेस सामान्यीकरण कर चुके हैं? क्या उन 20 उप प्रकारों को अलग-अलग माता-पिता इकाइयों में विभाजित नहीं किया जा सकता है? – RPM1984

+2

ऐसा लगता है कि अन्य ओआरएम किसी समस्या के बिना टीपीटी डिज़ाइन को संभालते हैं। ब्लॉग के संबंध में, यह बताता है कि जब डेटाबेस/क्लास डिज़ाइन को बड़ी संख्या में उपयोग किया जाता है, तो निष्पादन से पहले SQL उत्पन्न करने में लगने वाला समय कई मिनट से अधिक होता है, मुझे विश्वास है कि कथन का बैक अप लेने के लिए पर्याप्त है यह एक उत्पादन वातावरण में अनुपयोगी है। वाहन वाहन सूची के बारे में सोचें, जिसमें प्रत्येक वाहन (बेस टेबल/क्लास) के बारे में सामान्य जानकारी संग्रहीत की जाती है और फिर विमान/ट्रेन/ऑटो-मोबाइल (उप तालिका/कक्षा) के बारे में संग्रहीत अद्वितीय जानकारी - मैं वाहनों से निपट नहीं रहा हूं, लेकिन आप विचार – Tr1stan

+1

... और वहां> 20 विभिन्न वाहन प्रकारों को संग्रहीत किया जा रहा है, इससे पहले कि आप वाहन उपप्रकारों और सभी लुकअप मानों में भी जाना शुरू करें। – Tr1stan

उत्तर

1

यह थोड़ा उलझन में लगता है। आप TPH के बारे में बात कर रहे हैं, लेकिन जब आप कहते हैं:

तरह से मैं इसे देख, मैं एफई (शायद EFExtensions का प्रयोग करके) के भीतर से एक संग्रहीत प्रक्रिया के लिए एक संदर्भ जोड़ने के लिए सक्षम होना चाहिए TSQL है कि राक्षस यूनियन/एसपी के अंदर जॉइन के लिए ईएफ द्वारा उत्पन्न कोड का उपयोग करने के लिए केवल मुझे आवश्यक फ़ील्ड का चयन करता है, जब भी कॉल किया जाता है तो एसक्यूएल उत्पन्न होने से रोकता है - ऐसा कुछ नहीं जिसे मैं करना चाहता हूं, लेकिन आपको विचार मिलता है।

ठीक है, यह टेबल प्रति कंक्रीट क्लास मैपिंग (तालिका के बजाय एक proc का उपयोग करके है, लेकिन फिर भी, मैपिंग टीपीसी है ...)। ईएफ टीपीसी का समर्थन करता है, लेकिन डिजाइनर नहीं करता है। You can do it in code-first if you get the CTP

एक proc का उपयोग कर प्रदर्शन समस्याएं पैदा करता है, तो आप इस तरह के प्रश्नों को प्रतिबंधित, होगा आपका पसंदीदा समाधान:

var q = from c in Context.SomeChild 
     where c.SomeAssociation.Foo == foo 
     select c; 

डीबी अनुकूलक प्रोक कार्यान्वयन के माध्यम से नहीं देख सकते हैं, ताकि आप की एक पूरी स्कैन मिल परिणाम है।

तो इससे पहले कि आप स्वयं को बताएं कि इससे आपके परिणाम ठीक हो जाएंगे, उस धारणा को दोबारा जांचें।

ध्यान दें कि आप के साथ मैपिंग रणनीति के लिए हमेशा कस्टम एसक्यूएल निर्दिष्ट कर सकते हैं।

हालांकि, इससे पहले कि आप इनमें से कोई भी ऐसा करें, इस पर विचार करें, जैसा कि RPM1984 बताता है, आपका डिज़ाइन विरासत को अधिक उपयोग करने लगता है। मैं this quote from NHibernate in Action

तरह [एक] sk खुद चाहे वह ऑब्जेक्ट मॉडल में प्रतिनिधि मंडल के रूप में विरासत फिर करने के लिए बेहतर हो सकता है। निरंतर विरासत को लगातार दृढ़ता या ओआरएम से संबंधित सभी प्रकार के कारणों से बचाया जाता है। [आपका ओआरएम] ऑब्जेक्ट और रिलेशनल मॉडल के बीच एक बफर के रूप में कार्य करता है, लेकिन इसका मतलब यह नहीं है कि आप अपने ऑब्जेक्ट मॉडल को डिज़ाइन करते समय दृढ़ता की चिंताओं को पूरी तरह से अनदेखा कर सकते हैं।

+0

धन्यवाद क्रेग, मैं केवल अंतिम उपाय के रूप में टीपीएच का जिक्र कर रहा था - जो मैं वास्तव में प्राप्त करने की कोशिश कर रहा हूं वह टीपीटी है - मुझे लगता है कि मैं 1 बेस क्लास/टेबल और 1 आगे के उप-वर्ग/तालिकाओं को जटिल विरासत नहीं मानता । लेकिन फिर शायद आप मेरे वर्ग के डिजाइन की चौड़ाई का उल्लेख कर रहे हैं "व्यापक" जटिल (~ 23 सबक्लास) - हालांकि मुझे इन वर्गों को बनाए रखने के क्लीनर तरीके से मेरा सिर नहीं मिल रहा है। – Tr1stan

+0

ओह, और मैं ऑब्जेक्ट कॉन्टेक्स्ट.एक्सक्यूटस्टोरक्वायर के साथ आपके सुझाव के विकल्प के रूप में पूछताछ के एसपी विधि का जिक्र कर रहा था - फिर से, मैं बस उम्मीद कर रहा था कि मुझे कुछ स्पष्ट रूप से स्पष्ट याद आया था कि आप में से एक बुद्धिमान लोक मुझे इंगित कर सकता था। – Tr1stan

2

हमने इसी समस्या को मारा है और इस वजह से हमारे डीएएल को ईएफ 4 से LLBLGen पर पोर्ट करने पर विचार कर रहे हैं।

इस बीच, हम संकलित प्रश्नों का उपयोग किया है दर्द से कुछ कम करने के लिए:

Compiled Queries (LINQ to Entities)

इस रणनीति विशाल प्रश्नों को नहीं रोकता है, लेकिन समय यह प्रश्न उत्पन्न करने के लिए ले जाता है (जो विशाल हो सकता है) केवल एक बार किया जाता है।

आप संकलित उपयोग कर सकते हैं करेंगे प्रश्नों शामिल साथ() जैसे:

static readonly Func<AdventureWorksEntities, int, Subcomponent> subcomponentWithDetailsCompiledQuery = CompiledQuery.Compile<AdventureWorksEntities, int, Subcomponent>(
     (ctx, id) => ctx.Subcomponents 
      .Include("SubcomponentType") 
      .Include("A.B.C.D") 
      .FirstOrDefault(s => s.Id == id)); 

    public Subcomponent GetSubcomponentWithDetails(int id) 
    { 
     return subcomponentWithDetailsCompiledQuery.Invoke(ObjectContext, id); 
    } 
संबंधित मुद्दे