Я хочу сохранить пользовательские настройки в коллекции пар имя-значение, где значением может быть int, bool или строка.
Есть несколько способов снять кожу с этой кошки, но самый удобный способ, о котором я могу подумать, это что-то вроде этого:
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, хотя я думаю, что это возможно.
Как правило, вы бы отобразили более простой словарь как:
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 . Есть идеи?