我希望将用户偏好保存到名称值对的集合中,其中值可能是 int、bool 或 string。
有几种方法可以给这只猫剥皮,但我能想到的最方便的方法是这样的:
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");
但是对于一种“对象”,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>
我不确定你会如何在 Fluent NHibernate 中映射它。
也许有更好的方法可以做到这一点,或者我应该把它吸起来并使用 IDictionary<string, string>。有任何想法吗?