2010-11-17 17 views
6

मेरे मॉडल के साथ एक सीमांकित स्ट्रिंग के लिए एक सूची मानचित्रण कुछ इस तरह दिखता फ़ीचर करें | फ़ीचर दो | उदाहरण के लिए फ़ीचर तीन। धाराप्रवाह NHibernate

जब डाटाबेस से लिया गया, इसे वापस एक सूची

यह संभव है में उन वस्तुओं में से प्रत्येक रखना चाहिए?

उत्तर

9

मैं अपने वर्तमान प्रोजेक्ट में बहुत कुछ कर रहा हूं, केवल मैं पाइप-सीमित संख्याओं के रूप में enums का संग्रह जारी रख रहा हूं। यह वैसे ही काम करता है।

public class Product 
{ 
    protected string _features; //this is where we'll store the pipe-delimited string 
    public List<string> Features { 
     get 
     { 
      if(string.IsNullOrEmpty(_features) 
       return new List<String>(); 
      return _features.Split(new[]{"|"}, StringSplitOptions.None).ToList(); 
     } 
     set 
     { 
      _features = string.Join("|",value); 
     } 
    } 
} 

public class ProductMapping : ClassMap<Product> 
{ 
    protected ProductMapping() 
    { 
     Map(x => x.Features).CustomType(typeof(string)).Access.CamelCaseField(Prefix.Underscore); 
    } 
} 
+1

मुझे आपका समाधान पसंद है लेकिन एक प्रश्न पूछना चाहूंगा। आप 'फीचर्स' प्रॉपर्टी को 'लिस्ट' के रूप में बेनकाब करते हैं जिसमें यह सुझाव दिया जाता है कि इसे 'एड' और 'निकालें' आदि का उपयोग करके छेड़छाड़ की जा सकती है। क्या आपकी सूची वास्तव में ऐसा करती है। यदि नहीं, तो 'IENumerable' का खुलासा क्यों न करें? –

+0

बहुत अच्छा मुद्दा - जो वास्तव में अधिक समझ में आता है। मैं जोड़ने और हटाने के लिए सहायक तरीकों का उपयोग करता हूं। – DanB

+0

@DanB, पुरानी पोस्ट खोदने के लिए खेद है: आप बताते हैं कि आप enums का संग्रह बना रहे हैं, लेकिन यह मुझे स्पष्ट नहीं है कि आप इस समाधान में उस संग्रह को खींच रहे हैं। बस संदर्भ के लिए, आप यह पोस्ट देखने के लिए देख सकते हैं कि मैं क्या कर रहा हूं: http://stackoverflow.com/questions/14288249/want-to-save-selected-ie-more-than-1-enums-as-string- उपयोग के लिए – REMESQ

0

मैंने माईएसक्ल सेट डेटा प्रकार के लिए कुछ ऐसा ही कार्यान्वित किया, जो डीबी में अल्पविराम से अलग सूची है लेकिन इकाई मॉडल में तारों की एक सूची है। इसमें PrimitiveType क्लास के आधार पर, NHibernate में कस्टम डेटा प्रकार का उपयोग करना शामिल था। आप मैपिंग का उपयोग करने और मानचित्र पर कस्टम टाइप टाइप < कस्टम टाइप टाइप() विधि का उपयोग करते हैं।

यदि आप चाहते हैं कि मैं आपको कस्टम क्लास के लिए कोड स्निपेट भेज सकूं।

0

मैंने पॉइंट 3 डी संरचना के लिए कुछ भी लागू किया। चूंकि सीडीएमडॉटनेट ने कहा कि आप मूल रूप से कार्यान्वित करना चाहते हैं और IUserType जो NullSafeSet/NullSafeGet विधियों के माध्यम से एक स्ट्रिंग में सुविधाओं को पैक/अनपैक करेगा।

आपको समान सूक्ष्म() विधि को लागू करने की भी आवश्यकता हो सकती है, जो थोड़ा सूक्ष्म है। कारण है कि सबसे अच्छा एक उदाहरण के रूप में रेखांकित किया गया है:

Product p = session.Load(...); 
p.Features.Add("extra feature"); 
session.Save(p); 

बात, NHibernate जलयोजन दुकानों पर p.Features लिए एक संदर्भ है, और एक को बचाने के अनुरोध पर p.Features के मूल्य के तुलना करता है। अपरिवर्तनीय संपत्ति प्रकार के लिए यह ठीक है, लेकिन ऊपर के उदाहरण में, इन संदर्भों, समान हैं इतना प्रभावी तुलना

var x = p.Features; 
var changed = Equals(x, x); 

जाहिर है इस का एक मानक कार्यान्वयन हमेशा अवास्तविक लौटाते हैं है।

इससे किसी को कैसे निपटना चाहिए? मुझे नहीं पता कि क्या सबसे अच्छा अभ्यास है है, लेकिन समाधान हैं:

  • IUserType.Equals करें (वस्तु एक्स, वस्तु वाई) हमेशा अवास्तविक लौटाते। यह पैक की गई स्ट्रिंग को पुनर्निर्मित करने के लिए मजबूर करेगा और उत्पाद को सहेजने के हर बार एक डेटाबेस कॉल किया जाएगा, चाहे उत्पाद को अर्थपूर्ण रूप से बदला गया हो या नहीं। चाहे यह कोई मुद्दा है या नहीं, किसी भी कारक (फीचर ऑब्जेक्ट्स का आकार/गिनती, चाहे उत्पाद ऑब्जेक्ट्स बदले नहीं जाते हैं, आपके पास कितने उत्पाद ऑब्जेक्ट आदि हैं) पर निर्भर करता है।

  • विशेषताएं बनाएं और एक ChangeAwareList<T> : IList<T> लागू करें जो परिवर्तनों को ट्रैक करने में सक्षम है (या इसकी मूल प्रतिलिपि रखें) जागरूक है। IUserType.Equals (ऑब्जेक्ट एक्स, ऑब्जेक्ट वाई) को कार्यान्वित करने के लिए यह जांचने के लिए कि x/y चेंजवेयरवेयर हैं और यह देखने के लिए आवश्यक तर्क लागू करें कि सूची वास्तव में बदल गई है या नहीं। यह वह समाधान है जो मैं अंत में गया था।

  • शायद आप NHibernate GenericListType प्रकार से कोड का पुन: उपयोग कर सकते हैं। उस समय मैंने पिछले समाधान को लागू किया था, इस पर जाने के लिए मेरे पास पर्याप्त अनुभव नहीं था।

यदि आपके पास NHibernate के साथ कुछ पूर्व अनुभव है तो मुझे आशा है कि इससे आपको प्रारंभ करने में मदद मिलनी चाहिए। अगर मुझे नहीं पता है और मैं कोशिश करता हूं और एक और वर्बोज़ समाधान को एक साथ रखूंगा।

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