2011-04-11 16 views
6

मेरे पास एक कक्षा है जिसमें एक एनम प्रकार है जो इंगित करता है कि संदेश का प्रकार ईमेल या एसएमएस है या नहीं। enum प्रकार परिभाषित किया गया है:एनएचबर्ननेट, एसक्यूएल सर्वर - इंट मैपिंग

public enum ReminderType 
{ 
    Email = 1, 
    Sms = 2 
} 

वर्ग कि इस प्रकार का इस्तेमाल करता है लगता है:

public class Reminder : EntityBase 
{ 
    public virtual string Origin { get; set; } 
    public virtual string Recipient { get; set; } 
    public virtual ReminderType Type { get; set; } 
    public virtual Business Business { get; set; } 
    public virtual DateTime Created { get; set; } 

    public Reminder() 
    { 
     Created = DateTime.UtcNow; 
    } 
} 

जब मैं फिर भी डेटाबेस के लिए प्रकार अनुस्मारक की एक इकाई बने रहने की कोशिश करते हैं, मैं निम्नलिखित त्रुटि मिलती है:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value 'Email' to data type int. 

समर्थन फ़ील्ड प्रकार int की है, इसलिए मुझे यकीन है कि क्यों NHibernate डिफ़ॉल्ट रूप से स्ट्रिंग प्रतिनिधित्व मैप करने के लिए कोशिश कर रहा है नहीं कर रहा हूँ। मैं धाराप्रवाह NHibernate का उपयोग कर रहा है, और प्रासंगिक मानचित्रण कोड है:

mappings.Override<Reminder>(map => 
{ 
    map.Map(x => x.Type).Column("Type") 
}); 

मैं यकीन है कि NHibernate के डिफ़ॉल्ट व्यवहार को ints के रूप में enums मैप करने के लिए है हूँ, इसलिए क्यों यह इस मामले में ऐसा नहीं कर रहा है? यदि यह मायने रखता है, तो मैं SQL सर्वर 2005 का उपयोग कर रहा हूं।

+0

ईमेल प्रकार संपत्ति का स्ट्रिंग मान है। निबर्ननेट को इसे पूर्णांक मान 1 के रूप में संग्रहीत करने का प्रयास करना चाहिए, लेकिन यह इसके बजाय स्ट्रिंग 'ईमेल' को स्टोर करने का प्रयास कर रहा है, इसलिए त्रुटि। मुझे यकीन नहीं है कि यह क्यों कर रहा है ... – Chris

+0

http://stackoverflow.com/questions/439003/how-do-you-map-an-enum-as-an-int-value-with-fluent- nhibernate – dotjoe

+0

या http://stackoverflow.com/questions/1483044/mapping-enum-with-fluent-nhibernate –

उत्तर

3

मैं नहीं जानता कि क्यों इस व्यक्ति द्वारा पोस्ट की और उसके बाद रहता है उनकी टिप्पणी या उत्तर हटाना, लेकिन उनके द्वारा प्रदान किया गया लिंक() मेरे प्रश्न का उत्तर देता है। मैं सम्मेलन के लिए एक पूर्ण झटका वर्ग परिभाषा के साथ जाने के लिए नहीं चुना, बल्कि, मैपिंग कोड में एक इनलाइन सम्मेलन, इसलिए जैसे:

var mappings = AutoMap.AssemblyOf<Business>() 
    .Where(x => x.IsSubclassOf(typeof(EntityBase))) 
    .IgnoreBase(typeof(EntityBase)) 
    .Conventions.Add 
    (
     ConventionBuilder.Id.Always(x => x.GeneratedBy.Identity()), 
     ConventionBuilder.HasMany.Always(x => x.Cascade.All()), 
     ConventionBuilder.Property.Always(x => x.Column(x.Property.Name)), 
     Table.Is(o => Inflector.Pluralize(o.EntityType.Name)), 
     PrimaryKey.Name.Is(o => "Id"), 
     ForeignKey.EndsWith("Id"), 
     DefaultLazy.Always(), 
     DefaultCascade.All(), 

     ConventionBuilder.Property.When(
      c => c.Expect(x => x.Property.PropertyType.IsEnum), 
      x => x.CustomType(x.Property.PropertyType)) 
    ); 

पिछले सम्मेलन बिल्डर बयान चाल किया था। मैं उत्सुक हूं कि Fluent NHibernate का डिफ़ॉल्ट क्यों स्ट्रिंग के रूप में enums को मैप करना है। ऐसा लगता है कि ज्यादा समझ में नहीं आता है।

+1

जब आप int के रूप में एक enum मैप करते हैं, केवल वह ऐप (जो enum परिभाषित करता है) जानता है कि डीबी में इसका क्या अर्थ है। यह डेटाबेस में एक जादू संख्या की तरह है ... – dotjoe

+0

क्षमा करें, मैंने पहली टिप्पणी हटा दी क्योंकि कोड को फिर से पढ़ने के बाद मुझे एहसास हुआ कि मैंने गलती की थी और टिप्पणी प्रासंगिक नहीं थी और दूसरा एक जैसा दिखता था पहली Google हिट्स में से एक तो मैंने सोचा कि आप इसे पहले ही देख चुके हैं। – R0MANARMY

+0

@ डॉटोजो: यह उचित लगता है। मैंने लाइब्रेरी के पुराने संस्करणों के साथ काम किया था, जिसने विपरीत किया था (स्ट्रिंग के बजाय डिफ़ॉल्ट रूप से int के रूप में मैप किया गया था) हालांकि, यह व्यवहार के इस बदलाव के लिए आश्चर्यजनक रूप से भ्रमित था जैसे ऐसा दिखाना शुरू हुआ। – Chris

5

मैं एक ही बात कर रहा हूँ और यह बहुत की तरह काम कर ली ...

मेरे मामले EmployeeType में enum वर्ग

Map(x => x.EmployeeType, "EmployeeType_Id").CustomType(typeof (EmployeeType)); 
+0

यह सही होगा अगर मैं कभी भी संपत्ति-विशिष्ट आधार पर ऐसा करना चाहता था। – Chris

0

आपको एनएचबर्ननेट में इंट के रूप में कभी भी एनम को मानचित्र नहीं करना चाहिए। यह ghost updates होने का कारण बन जाता है।

इसका सबसे अच्छा तरीका एक्सएमएल मैपिंग में एक प्रकार की संपत्ति सेट नहीं कर रहा है। Fluent NHibernate में यह प्राप्त करने के लिए आप .CustomType(string.Empty) का उपयोग कर सकते हैं।

कुछ अतिरिक्त जानकारी आप here पा सकते हैं।

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