2013-02-17 29 views
15

के लिए समर्थन करता है, मैंने अभी एक प्रतिभा के बारे में सीखा है जो मेरे बहुत सारे काम को सरल बना देगा लेकिन ऐसा लगता है कि मेरी पसंदीदा ओआरएम इसे पहचान नहीं पाती है।SQL सर्वर विशिष्ट प्रकार OrmLite

क्या सर्विसस्टैक OrmLite को SQL सर्वर में HierarchyId पहचानने के लिए कोई कामकाज है? किसी भी सुझाव के बारे में कि कौन से फाइलों को संशोधित करना है और कोई संकेत कैसे आगे बढ़ना है?

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

यहाँ समस्या का एक बेहतर उदाहरण है। मेरे पास निम्न वर्ग है:

public class MyClass 
{ 
    public int Id { get; set; } 
    public SqlHierarchyId HierarchyId { get; set; } 
} 

SqlHierarchyId एक कस्टम SQL सर्वर डेटा प्रकार है। OrmLite इसके लिए निम्नलिखित वर्ग उत्पन्न करेगा:

First MyClass Rendering

अजीब पर्याप्त, मैं संपत्ति पर [StringLength(255)] विशेषता का उपयोग कर सकते हैं और यह बजाय varchar(255) प्रकार मिल जाएगा:

Second MyClass Rendering

मैं मैन्युअल तालिका को यहां बदल दिया और अंतर दिखाने के लिए कॉलम डेटा प्रकार जोड़ा। कृपया ध्यान दें तीसरे स्तंभ के डेटा प्रकार:

SqlHierarchyId

एक varchar प्रतिनिधित्व होने it can be converted within C# के रूप में अन्य डीबीएमएस के साथ पूरी तरह ठीक है, लेकिन SQL सर्वर के साथ यह संबंधित डेटा प्रकार से मेल करने के लिए बेहतर है। इससे विचारों का निर्माण आसान हो जाएगा (hierarchyid डेटा प्रकार के अंतर्निहित कार्यों के कारण)।

मुझे पता है कि प्रकार ईएफ 4 (5 के बारे में सुनिश्चित नहीं है) द्वारा समर्थित नहीं है। मैंने गिटहब पर OrmLiteDialectProviderBase.cs फ़ाइल भी ब्राउज़ की और मैं समर्थित ADO.NET डेटा प्रकारों की एक सूची देख सकता हूं।

मेरा सरल सवाल यह है: क्या यह एडीओ.NET द्वारा एक मजबूत सीमा है या इसे ओर्मेलाइट में कभी देखा जा सकता है? यदि कोई सुझाव दिया जाता है तो मैं इस भाग को विस्तारित करने में मदद करने के लिए तैयार हूं।

+2

क्या आप किसी ऐसे एसक्यूएल + कोड-उदाहरण को दिखा सकते हैं जिसे आप OrmLite को समर्थन देना चाहते हैं? – mythz

+1

यह सुनिश्चित नहीं है कि OrmLite क्या करता है, लेकिन ऐसा लगता है कि इसे एक स्ट्रिंग प्रकार से मेल खाना चाहिए, क्योंकि इसमें डेटा '/ 123/234/125' है। – RedFilter

+0

@mythz: कृपया संपादित प्रश्न –

उत्तर

1

ADO.NET को पदानुक्रम प्रकार के लिए समर्थन है, उदाहरण एक उदाहरण here पाया जा सकता है और दिखाता है कि ADO.NET एसक्यूएल सर्वर से सीधे पदानुक्रम के रूप में मान पढ़ सकता है लेकिन आपको सर्वर पर पैरामीटर को स्ट्रिंग के रूप में पास करने की आवश्यकता है।

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

आप अपने डेटाबेस में पदानुक्रम की एक स्ट्रिंग प्रस्तुति रखकर और पदानुक्रमित संस्करण को अपने डेटाबेस और आपके सी # कक्षा दोनों में गणना की गई संपत्ति के रूप में इस मुद्दे के आसपास काम कर सकते हैं, आपको गणना की गई सी # संपत्ति को बाहर करने की आवश्यकता होगी ओआरएम मैपिंग

उदाहरण के लिए आपके तालिका स्तंभ घोषित किया जाएगा के रूप में:

[SqlHierarchyId] AS ([hierarchyid]::Parse([HierarchyId])) PERSISTED 

और अपने वर्ग के रूप में:

public class MyClass { 

    public string HierarchyId { 
     get; 
     set; 
    } 

    [Ignore] 
    public SqlHierarchyId SqlHierarchyId { 
     get { 
      return SqlHierarchyId.Parse(new SqlString(HierarchyId)); 
     } 
     set { 
      HierarchyId = value.ToString(); 
     } 
    } 

} 

हो जाएगा ताकि नेट परत से अपडेट कायम है और आप hierarchyid तरीकों का उपयोग करने की अनुमति SQL सर्वर में क्वेरी बनाने और .NET परत में भौतिक वस्तुओं के साथ काम करने के लिए।

आप परत ORM में स्ट्रिंग प्रतिनिधित्व के खिलाफ क्वेरी बनाने के लिए होता है लेकिन यह अभी भी उदाहरण के लिए, hierarchyid सहायक तरीकों के कुछ लाभ उठाने सकता है:

public IEnumerable<MyClass> GetDescendants(MyClass node) { 

    string currentLocation = node.HierarchyId; 
    string followingSibling 
     = node.SqlHierarchyId.GetAncestor(1) 
       .GetDescendant(node.SqlHierarchyId, SqlHierarchyId.Null) 
       .ToString(); 

    return db.Select<MyClass>(n => n.HierarchyId > currentLocation 
           && n.HierarchyId < followingSibling); 

} 

Aplogies अगर मैं ORMLite वाक्य रचना गलत मिला है।