2010-03-21 13 views
7

Kullanıcı tercihlerini, değer bir int, bool veya dize olabileceği bir ad değeri çiftleri koleksiyonuna devam ettirmek istiyorum.IDictionary <string, object> Fluent NHibernate ile nasıl eşlenir?

Orada bu kediyi için birkaç yol vardır, ama aklıma gelen en uygun yöntem böyle bir şeydir:

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

onun kullanımı ile olduğu gibi:

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

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

Ben Fluent NHibernate'de nasıl haritalanacağından emin değilim, ancak bunun mümkün olduğunu düşünüyorum.

Genellikle, gibi dize > daha basit bir sözlük < dize map olacaktır:

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

Ama 'nesne' türüyle NHibernate bununla nasıl başa bilmiyor. Türünü temsil eden bir dizgeye ve değeri temsil eden bir dizgeye 'nesne' ayıran özel bir Kullanıcı Türü oluşturulabileceğini hayal ediyorum. Böyle tür görünen bir tablo olurdu:

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

ve hazırda bekletme haritalama bu istiyorum:

<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> 

Sana Akıcı NHibernate bu harita nasıl emin değilim.

Belki bunu yapmak için daha iyi bir yol var, ya da belki de sadece emmek ve IDictionary < dize, dize > kullanın. Herhangi bir fikir?

+0

Bir çözüm buldunuz mu? –

+0

Teşekkürler, sadece ne aradığımı – jolySoft

cevap

6

IDictionary<string,string>'un çok daha kolay olacağını söyleyebilirim. Ancak burada

 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

Yardım arkadaşım için teşekkürler, spot on – jolySoft

+0

ImmutableUserType nedir? NHibernate veya FNH'de bir referans bulamıyorum. –

+0

@JeffDoolittle NH'nin IUseryType uygulamasını kendi temel modelimdir. Burada yayınladım http://stackoverflow.com/a/7484139/671619 – Firo