2013-04-11 10 views
6

मैं समझता हूँ कि NHibernate में, कोड द्वारा मानचित्रण का उपयोग कर, मैं परिशुद्धता और पैमाने एक दशमलव संपत्ति का तो जैसे निर्दिष्ट कर सकते हैं के साथ मानचित्र सब दशमलव:Nhibernate: एक ही सटीक और बड़े पैमाने

Property(
    x => x.Dollars, 
    m => 
     { 
      m.Precision(9); 
      m.Scale(6); 
     } 
); 

यह अच्छा है, लेकिन मैं सोच रहा था कि क्या कोई तरीका है कि मैं आसानी से सभी वर्गों में दशमलव गुणों के सभी को आसानी से मानचित्र कर सकता हूं। ऐसा लगता है कि मुझे अपने सभी मैपिंग्स के माध्यम से जाना होगा और उनमें से प्रत्येक को हाथ से अपडेट करना होगा। क्या कोई जानता है कि यह कैसे प्राप्त किया जा सकता है?

उत्तर

4

उपयोग ModelMapper पर BeforeMapProperty: -: के रूप में इन आपके सम्मेलन सेट को पार कर जाएगी अपनी मैपिंग वर्गों से

m => { m.Precision(9); m.Scale(6); } 

-

var mapper = new ModelMapper(); 

mapper.BeforeMapProperty += (inspector, member, customizer) => { 
    if (member.LocalMember.GetPropertyOrFieldType() == typeof (decimal)) 
    { 
     customizer.Precision(9); 
     customizer.Scale(6); 
    } 
}; 

जोड़ने के लिए केवल दूसरी बात की सभी घटनाओं को दूर है BeforeMapProperty में जब तक आपके पास अन्य दशमलव नहीं होते हैं जिनमें अलग-अलग पैमाने या सटीक होते हैं।

0

क्या आप FluentNHibernate का उपयोग कर सकते हैं? यह आपको जितनी जरूरत हो उतनी लचीलापन के साथ सम्मेलनों को लागू करने में सक्षम बनाता है। यहाँ देखें: https://github.com/jagregory/fluent-nhibernate/wiki/Conventions और यहाँ: http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/ जहां यह इस विशिष्ट उदाहरण है:

public class StringColumnLengthConvention 
    : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
        criteria.Expect(x => x.Type == typeof(string)) 
            .Expect(x => x.Length == 0); 
    } 
  
    public void Apply(IPropertyInstance instance) 
    { 
        instance.Length(100); 
    } 
} 

यह लगता है कि आप आसानी से जैसे वह तार के साथ करता है सब दशमलव के नक्शे के लिए अनुकूल हो सकता है।

+0

मैं नहीं बल्कि चाहूंगा। कुछ दर्जन वर्ग मैप किए गए हैं, और फ्लुएंट पर बदलने से मेरे दशमलव को फिर से मैप करना आसान होगा। हालांकि धन्यवाद। –

3

आप UserType लिख सकते हैं। लाभ यह है कि आप आसानी से विभिन्न प्रकार के दशमलव को अलग कर सकते हैं (आप शायद सभी दशमलव के लिए समान सटीकता नहीं चाहते हैं)।

Property(
    x => x.Dollars, 
    m => m.Type<MoneyUserType>() 
); 

आप सभी मौद्रिक गुण में इस डाल करने के लिए कुछ प्रयास किया है, लेकिन है तो आप एक अधिक पठनीय और आत्म वर्णनात्मक मानचित्रण परिभाषा नहीं है।


ऐसा ही एक समाधान (वाक्य रचना), लेकिन लागू करने के लिए आसान है, एक विस्तार विधि जो सटीक सेट लिखने के लिए है।

Property(
    x => x.Dollars, 
    m => m.MapMoney() 
); 

public static void MapMoney(this IPropertyMapper mapper) 
{ 
    m.Precision(9); 
    m.Scale(6); 
} 

यहां वही है: यह मैपिंग परिभाषा को और अधिक वर्णनात्मक बनाता है।

(हाँ मुझे पता है कि आप सभी फाइलों को बदलना नहीं चाहते हैं, लेकिन मैं अभी भी की सिफारिश करता हूं ताकि यह जानकारी मैपिंग फाइलों में रख सके, क्योंकि यह वास्तव में दशमलव है कि यह वास्तव में क्या है। यह बहुत आसान है सभी धन संपत्तियों के लिए मानचित्रण बदलने के लिए है, लेकिन राशि गुण रहते हैं। पूरी तरह से निहित समाधान के लिए, पर पढ़ें।)


वैकल्पिक रूप से आप मैपिंग इस्तेमाल कर सकते हैं। ये बहुत शक्तिशाली है। आप अभी भी मैपिंग फ़ाइल में सटीकता ओवरराइट कर सकते हैं, जो बहुत लचीलापन प्रदान करता है।

mapper.BeforeMapProperty += MapperOnBeforeMapProperty; 


private void MapperOnBeforeMapProperty(
    IModelInspector modelInspector, 
    PropertyPath member, 
    IPropertyMapper propertyCustomizer) 
{ 
    Type propertyType; 
    // requires some more condition to check if it is a property mapping or field mapping 
    propertyType = (PropertyInfo)member.LocalMember.PropertyType; 
    if (propertyType == typeof(decimal)) 
    { 
     propertyCustomizer.Precision(9); 
     propertyCustomizer.Scale(6); 
    } 
} 

यह भी एक डिफ़ॉल्ट के रूप में, मानचित्रण सम्मेलन में उपयोगकर्ता प्रकार डाल करने के लिए संभव है।

+0

बहुत अच्छा जवाब, मैं इसे लेता हूं आप वास्तव में इन बिंदुओं को चाहते हैं! :) – Rippo

+0

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

+0

चिंता मत करो +1 से भी – Rippo

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