2011-08-26 16 views
5

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

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

मैंने एक संपत्ति (संपत्ति के नाम से) पढ़ने के लिए केवल एक प्रक्रिया होने का विचार किया और दूसरा इसे अपडेट करने के लिए (नाम और मूल्य से) तो एक ही बयान में एक इकाई के लिए एक गुच्छा या सभी गुणों को पढ़ने के लिए कुछ सामान्य प्रक्रियाएं । यदि आप जेनेरिक का उपयोग करने पर विचार करते हैं तो यह सी # में आसान लग सकता है लेकिन डेटाबेस जेनेरिक नहीं जानता है, इसलिए मजबूत टाइप किए गए समाधान के लिए संभव नहीं है।

मैं एक ऐसा समाधान करना चाहता हूं जो "यथासंभव दृढ़ता से टाइप किया गया" है, इसलिए मुझे बहुत सारे कास्टिंग और पार्सिंग करने की आवश्यकता नहीं है। मैं कोड में उपलब्ध गुणों को परिभाषित करता हूं ताकि आप जो उपलब्ध कर रहे हैं उसका आकलन न करें और जादू तारों और इसी तरह का उपयोग करें। फिर सिस्टम में एक नई संपत्ति जोड़ने की प्रक्रिया का मतलब केवल तालिका में एक नया कॉलम जोड़ना होगा और कोड में एक नई संपत्ति "परिभाषा" जोड़ना होगा (उदाहरण के लिए एक enum में)।

+0

आप ईएफ का उपयोग क्यों नहीं कर सकते? माइक्रोसॉफ्ट में प्रतिभाओं ने पहले ही इस बारे में पता लगाया है और आपके लिए बहुत सारे काम किए हैं। मैं आपको पहिया का पुन: आविष्कार देखने से नफरत करता हूं। – Jay

+0

हाँ, मुझे समझ में नहीं आता कि आपको ओआरएम से बचने की आवश्यकता क्यों है। (साथ ही, मुझे नहीं पता कि सी # जेनेरिक को इनमें से किसी के साथ क्या करना है) –

+0

मैं सहमत हूं लेकिन ईएफ आर्किटेक्चर के संबंध में सड़क से थोड़ी दूर है इसलिए मैं इसका अभी तक उपयोग नहीं कर सकता। – CyberDude

उत्तर

2

ऐसा लगता है कि आप ऐसा करना चाहते हैं:

MyObj x = new MyObj(); 
x.SomeProperty = 10; 

आप उस के लिए निर्मित तालिका है, लेकिन जब आप जोड़ने

x.AnotherProperty = "Some String"; 

आप की जरूरत है आपको लगता है कि तालिका में फेरबदल रखना चाहते हैं न इसलिए जैसे तालिका डेटा को सामान्य:

-> BaseTable 
    RecordId, Col1, Col2, Col3 

-> BaseTableProperty 
    PropertyId, Name 

-> BaseTableValue 
    ValueId, RecordId, PropertyId, Value 

आपका वर्ग तो ऐसा दिखाई देगा:

public class MyObj 
{ 
     public int Id { get; set; } 
     public int SomeProperty { get; set; } 
     public string AnotherProperty { get; set; } 
} 

जब आप अपनी डीएल से अपना ऑब्जेक्ट बनाते हैं, तो आप रिकॉर्ड सेट की गणना करते हैं। फिर आप एक बार कोड लिखते हैं जो संपत्ति को आपके कॉन्फ़िगरेशन (BaseTableProperty.Name == MyObj.<PropertyName>) के समान नाम के रूप में जांचता है - और फिर उस प्रकार के प्रकार को कास्ट करें जैसा कि आप रिकॉर्ड सेट को गिनते हैं।

फिर, आप बस एक और संपत्ति जोड़ते हैं अपने वस्तु, BaseTableProperty में डेटाबेस के लिए एक और रिकार्ड, और फिर आप BaseTableValue में है कि पुरुष के लिए मान संग्रहीत कर सकते

उदाहरण:।

RecordId 
======== 
1 

PropertyId   Name 
==========   ==== 
1     SomeProperty 

ValueId  RecordId  PropertyId  Value 
=======  ========  ==========  ===== 
1   1    1    100 

आप दो परिणाम सेट, बुनियादी डेटा के लिए, और एक है में शामिल हो गए संपत्ति और मूल्य सारणी से।जैसा कि आप प्रत्येक रिकॉर्ड की गणना करते हैं, आप SomeProperty का नाम देखते हैं - typeof(MyObj).GetProperty("SomeProperty") मौजूद है? हाँ? यह डेटा प्रकार क्या है? int? ठीक है, तो संपत्ति की स्थापना द्वारा int लिए "100" बदलने की कोशिश:

propertyInfo.SetValue(myNewObjInstance, Convert.ChangeType(dbValue, propertyInfo.PropertyType), null); 

प्रत्येक प्रॉपर्टी के लिए।

+0

बंद हो रहा है लेकिन मैं वास्तव में कक्षा में प्रत्येक संपत्ति की घोषणा या आवश्यकता नहीं है। यह शायद ही कभी होता है कि मुझे एक समय में एक से अधिक संपत्ति की आवश्यकता है। अधिकांश बार मेरे पास ऑब्जेक्ट आईडी होती है और केवल गुणों में से एक को जानने की आवश्यकता होती है। यही कारण है कि मैं एक सामान्य 'GetProperty (int objectID, string propertyName)' विधि रखने की ओर जा रहा था। – CyberDude

+0

मैं इसे स्वीकार करूँगा क्योंकि यह उस समाधान के सबसे नज़दीक है जिसे मैं लेने जा रहा हूं। – CyberDude

0

भले ही आपने कहा कि आप उनका उपयोग नहीं कर सकते हैं, यही वह है जो अधिकांश ओआरएम करता है। आप जिस पर उपयोग करते हैं (या यहां तक ​​कि अगर यह सीखने का अनुभव भी है) के आधार पर, वे जटिलता और प्रदर्शन में काफी भिन्न होंगे। यदि आप हल्के वजन वाले ओआरएम पसंद करते हैं, तो Dapper.Net देखें। यह जेनेरिकों का भी उपयोग करता है, ताकि आप कोड देख सकें, देखें कि यह कैसे काम करता है, और यदि आवश्यक हो तो अपना स्वयं का समाधान बनाएं।

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