我希望将用户偏好存储为键值对的集合,其中值可以是整数、布尔值或字符串。
有几种实现方法,但我认为最方便的方法是像这样:
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"];
我不确定如何在Fluent NHibernate中映射此内容,但我认为这是可能的。通常,您可以将较简单的Dictionary<string, string>映射为:
HasMany(x => x.Preferences)
.Table("Preferences")
.AsMap("preferenceName")
.Element("preferenceValue");
但是对于类型为“object”的情况,NHibernate并不知道如何处理。我想可以创建一个自定义的UserType,将“object”分解为表示其类型的字符串和表示其值的字符串。我们将拥有一个类似于下面的表:
Table Preferences
userId (int)
preferenceName (varchar)
preferenceValue (varchar)
preferenceValueType (varchar)
然后,Hibernate 的映射应该如下所示:
<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>
我不确定如何在Fluent NHibernate中进行映射。
也许有更好的方法来解决这个问题,或者我应该使用IDictionary<string, string>。你有什么想法吗?