gpt4 book ai didi

fluent-nhibernate - 如何在 Fluent NHibernate 中映射 IDictionary

转载 作者:行者123 更新时间:2023-12-04 12:14:41 24 4
gpt4 key购买 nike

我希望将用户首选项保留到名称值对集合中,其中值可以是 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 映射为:
HasMany(x => x.Preferences)
.Table("Preferences")
.AsMap("preferenceName")
.Element("preferenceValue");

但是对于“对象”类型,NHibernate 不知道如何处理它。我想可以创建一个自定义 UserType 将“对象”分解为一个表示其类型的字符串和一个表示值的字符串。我们会有一个看起来像这样的表:
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 。有任何想法吗?

最佳答案

我会说 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
};
}
}
}

关于fluent-nhibernate - 如何在 Fluent NHibernate 中映射 IDictionary<string, object>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com