2010-03-21 10 views
7

मैं उपयोगकर्ता वरीयताओं को नाम मूल्य जोड़ों के संग्रह में कायम रखने के लिए देख रहा हूं, जहां मान int, bool, या स्ट्रिंग हो सकता है।Fluent NHibernate में IDictionary <string, object> को कैसे मैप करें?

इस बिल्ली त्वचा के लिए कुछ तरीके हैं, लेकिन सबसे सुविधाजनक तरीका मैं के बारे में सोच सकते हैं कुछ इस तरह है: के रूप में इसके उपयोग के साथ

public class User 
{ 
    public virtual IDictionary<string, object> Preferences { get; set; } 
} 

:

user.Preferences["preference1"] = "some value"; 
user.Preferences["preference2"] = 10; 
user.Preferences["preference3"] = true; 

var pref = (int)user.Preferences["preference2"]; 

मैं यह सुनिश्चित नहीं है कि फ्लुएंट एनएचबर्ननेट में इसे कैसे मैप करें, हालांकि मुझे लगता है कि यह संभव है।

आम तौर पर, यदि आप इससे आसान शब्दकोश < स्ट्रिंग के रूप में स्ट्रिंग > नक्शा होगा,:

HasMany(x => x.Preferences) 
    .Table("Preferences") 
    .AsMap("preferenceName") 
    .Element("preferenceValue"); 

लेकिन 'वस्तु' का एक प्रकार के साथ, NHibernate इसके साथ सौदा करने के लिए कैसे पता नहीं है। मुझे लगता है कि कस्टम यूजर टाइप टाइप किया जा सकता है जो एक 'ऑब्जेक्ट' को स्ट्रिंग पर टाइप करता है जो उसके प्रकार का प्रतिनिधित्व करता है और एक स्ट्रिंग मान का प्रतिनिधित्व करता है। हम एक मेज है कि इस तरह तरह का लग रहा है होगा:

Table Preferences 
    userId (int) 
    preferenceName (varchar) 
    preferenceValue (varchar) 
    preferenceValueType (varchar) 

और हाइबरनेट मानचित्रण इस चाहते हैं:

<map name="Preferences" table="Preferences"> 
    <key column="userId"></key> 
    <index column="preferenceName" type="String" /> 
    <element type="ObjectAsStringUserType, Assembly"> 
    <column name="preferenceValue" /> 
    <column name="preferenceValueType"/> 
    </element> 
</map> 

मुझे यकीन है कि कैसे आप धाराप्रवाह NHibernate में इस नक्शे हैं नहीं कर रहा हूँ।

शायद ऐसा करने का एक बेहतर तरीका है, या शायद मुझे इसे चूसना चाहिए और IDictionary < स्ट्रिंग, स्ट्रिंग > का उपयोग करना चाहिए। कोई विचार?

+0

क्या आपको कोई समाधान मिला? –

+0

धन्यवाद, बस मैं जो देख रहा था – jolySoft

उत्तर

6

मैं कहूंगा कि IDictionary<string,string> बहुत आसान होगा। हालांकि यहां कोड

 HasMany(u => u.Preferences) 
      .Table("Preferences") 
      .AsMap("preferenceName") 
      .Element("preferenceType", e => e.Column("preferenceValue").Type<ObjAsStringUserType>()); 

class ObjAsStringUserType : ImmutableUserType 
{ 
    public override object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var type = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]); 
     var value = (string)NHibernateUtil.String.NullSafeGet(rs, names[1]); 

     switch (type) 
     { 
      case "boolean": 
       return bool.Parse(value); 
       ... 
      default: 
       return null; 
       break; 
     } 
    } 

    public override void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     var type = value.GetType().Name; 
     var valuestring = value.ToString(CultureInfo.InvariantCulture); 

     NHibernateUtil.String.NullSafeSet(cmd, type, index); 
     NHibernateUtil.String.NullSafeSet(cmd, valuestring, index + 1); 
    } 

    public override Type ReturnedType 
    { 
     get { return typeof(object); } 
    } 

    public override SqlType[] SqlTypes 
    { 
     get { return new [] 
     { 
      SqlTypeFactory.GetString(length: 255), // preferenceType 
      SqlTypeFactory.GetString(length: 255), // preferenceValue 
     }; 
     } 
    } 
} 
+0

मदद फेलो के लिए धन्यवाद, – jolySoft

+0

पर स्पॉट ImmutableUserType क्या है? मुझे NHibernate या FNH में इसका संदर्भ नहीं मिल रहा है। –

+0

@ जेफडूलिटल यह मेरा स्वयं का बेसटाइप है जो एनएच के आईयूएसरी टाइप को कार्यान्वित करता है। मैंने इसे यहां पोस्ट किया है http://stackoverflow.com/a/7484139/671619 – Firo

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