2011-12-21 17 views
12

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

वर्तमान समस्या मेरे पास एक अमूर्त वर्ग आदेश के साथ है, इस वर्ग को एक भेदभाव संपत्ति का उपयोग करके दो अलग-अलग वर्गों AutionOrder और MerchantOrder द्वारा कार्यान्वित किया जाता है।

चूंकि मैं एक वस्तु बनाने के लिए डैपर का उपयोग नहीं कर सकता जो एक सार वर्ग है, मैं इसके बजाय सार्वजनिक वर्गों में से एक का उपयोग कर रहा हूं। हालांकि जब यह ऑब्जेक्ट बनाने के लिए जाता है तो यह GetSettableProps के अंदर विफल हो रहा है, यह उचित DeclaringType ढूंढ रहा है लेकिन GetProperty विधि internal पर मौजूद किसी प्रॉपर्टी की तलाश में शून्य हो रही है या EntitySet है। मैंने बिना किसी सफलता के t.BaseType.GetProperty के साथ-साथ p.GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(p.Name).GetSetMethod(true) का उपयोग करके इसके आसपास हैक करने की कोशिश की है।

डमी वस्तुओं:

आदेश

OrderID, नाम, पता, RowVersion (आंतरिक), लदान (EntitySet), ORDERDETAILS (EntitySet), तो ग्राहक (EntityRef)

शिपमेंट

शिपमेंट आईडी, ऑर्ड Erid, TRACKINGNUMBER

ORDERDETAILS

OrderDetailID, OrderID, उत्पाद, मात्रा, मूल्य

ग्राहक

CustomerID, नाम,

इस विशेष एसक्यूएल हिट के लिए मैं 1 से 1 रिलेशनशिप मैपिंग्स में से कुछ को पकड़ने की कोशिश कर रहा हूं।

चयन ओ। * ऑर्डर से ओ के रूप में ग्राहकों को ओ में शामिल किया गया है। कस्टमर आईडी = सी। कस्टमर आईडी जहां ओ। ऑर्डर आईडी (1,2,3);

using (var connection = new SqlConnection(_ConnectionString)) 
{ 
    connection.Open(); 
    results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(), 
     (o, c) => { o.Customer = c; return o; }, 
     splitOn: "CustomerID"); 
} 

अगर मैं एक सार्वजनिक वर्ग इस समस्या हालांकि चली जाती होने के लिए आदेश को बदलने, लेकिन यह एक वांछित नहीं है:

यह है कि मैं क्या व्यवसायिक उपयोग और यह कर यह जादू है यह बताने के लिए उपयोग कर रहा हूँ है दुष्प्रभाव। RowVersion के लिए propInfo सेट करने का प्रयास करते समय यह असफल रहा है - इस समस्या को हल करने के बजाय इसे पबिक में स्विच करना - हालांकि वांछित नहीं है। लेकिन फिर यह विफल रहता है जब यह ऑर्डर के लिए शिपमेंट ऑब्जेक्ट्स बनाने की कोशिश कर रहा है। ऑर्डर एक सार्वजनिक वर्ग है, फिर से यह कोई मुद्दा नहीं है।

इसके अलावा, मैं इस तरह के आदेश करने के लिए आदेश करने के लिए लदान और ORDERDETAILS के रूप में एक रिश्ते को कई में खींचने के लिए अलग-अलग क्वेरी कर रहा हूँ और एक उचित आदेश वस्तु में परिणाम को सामान्य। MerchantOrder काफी कोई वास्तविक विशेष तर्क के साथ एक खाली वर्ग है। यहाँ भेदभाव अलग बस कैसे हम CustomerID जो वास्तविक एसक्यूएल वैसे भी हिट करने से पहले दूर निकाला है खोजने में पहुंचते हैं।

इसके अलावा, मैं 2011/12/20 के रूप में व्यवसायिक नवीनतम संस्करण का उपयोग कर रहा हूँ।

मैं वास्तव में व्यवसायिक तरह है, लेकिन इस समस्या को मेरे सिर Asplode कर रहा है - तो सहायता के लिए धन्यवाद

+0

आप एक असफल परीक्षण जोड़ सकते हैं ताकि मैं इसे ठीक कर सकते हैं? बस इसके साथ एक पैच सबमिट करें –

+0

मैंने एक असफल परीक्षण जोड़ा है @ https://code.google.com/r/johnzaborow-fail-test/ मुझे अपने परिवर्तनों को स्वचालित रूप से दबाकर कई समस्याएं आईं, इसलिए मैंने इसे एक करके किया । अगर कुछ भी बदलने की जरूरत है तो मुझे बताएं। धन्यवाद! – John

+0

अब तय है, धन्यवाद! –

उत्तर

7

यह एक बग था कि अब ट्रंक में तय हो गई है:

public class AbstractInheritance 
    { 
     public abstract class Order 
     { 
      internal int Internal { get; set; } 
      protected int Protected { get; set; } 
      public int Public { get; set; } 

      public int ProtectedVal { get { return Protected; } } 
     } 

     public class ConcreteOrder : Order 
     { 
      public int Concrete { get; set; } 
     } 
    } 

    // http://stackoverflow.com/q/8593871 
    public void TestAbstractInheritance() 
    { 
     var order = connection.Query<AbstractInheritance.ConcreteOrder>("select 1 Internal,2 Protected,3 [Public],4 Concrete").First(); 

     order.Internal.IsEqualTo(1); 
     order.ProtectedVal.IsEqualTo(2); 
     order.Public.IsEqualTo(3); 
     order.Concrete.IsEqualTo(4); 

    } 

एक ओर ध्यान दें कि, डिजाइन से, हम आधार वर्ग में निजी क्षेत्रों या गुण सेट नहीं है। व्यवहार जादुई और संगत नहीं हो सकता है।

उदाहरण के लिए:

class A { private int a {get; set;} } 
class B : A { private int a {get; set;} } 
class C: B {} 

// What should "select 1 a" do? Set it on A? Set it on B? Set it on Both? Set it on neither? 

हम साथ चला गया "पर सेट न तो"

+0

फिक्स के लिए बहुत बहुत धन्यवाद! यह मुझे थोड़ी देर के लिए मेरे सिर खरोंच था! सर्वश्रेष्ठ जन्मदिन का उपहार मुझे इस साल मिला! – John

+0

कोई चिंता नहीं, खुशी हुई यह काम किया! –

0

मुझे लगता है कि अपने कोड को संशोधित करने के बिना (सार वर्ग की वजह से) संभव नहीं है।

मुझे एक ही समस्या थी और असेंबली में एक नया ऑब्जेक्ट निजी बना दिया गया जहां मेरे पास अमूर्त बेस क्लास से प्राप्त मेरे भंडार हैं।

इस वर्ग है अमूर्त और केवल भंडार वर्ग है कि डेटा, इस वर्ग के लिए किया था सभी आवश्यक वास्तविक तालिका के लिए तरीकों को संग्रहीत करता है को दिखाई नहीं।