我有一个NHibernate映射问题,我可以使用帮助 - 文档&样本对我来说似乎很不清楚。
我有一个类,其中包含另一个类的字典。我不确定正确的映射,我尝试的所有内容都无法映射,或者在读取数据时遇到NHibernate异常。
这两个类是:
public class SnippetConfigParam
{
public virtual int SnippetValueKey { get; set; }
public virtual string ParamName { get; set; }
public virtual string Value{ get; set; }
}
public class SnippetConfig
{
public virtual int SnippetKey { get; set; }
public virtual ESnippetType Type{ get; set; }
public virtual string Name { get; set; }
public virtual IDictionary<string, SnippetConfigParam> Params { get; set; }
public virtual string Description{ get; set; }
public virtual VendorPage Page{ get; set; }
}
我上次的映射尝试是
<map name="Params" table="SnippetConfigValue" lazy="false">
<key column="SnippetConfigKey" />
<index column="SnippetValueKey" type="Int32"/>
<composite-element class ="SnippetConfigParam">
<property name="ParamName" />
<property name="Value" />
</composite-element>
</map>
结果是:
System.InvalidCastException:无法转换类型为&#39; System.Int32&#39;的对象输入&#39; System.String&#39;。
所以我显然不理解某事。数据库表是:
Create Table SnippetConfig
SnippetKey int not null,
...
PrimaryKey( 'SnippetKey' )
Create Table SnippetConfigValue
SnippetValueKey int not null,
...
PrimaryKey( 'SnippetValueKey' ),
Key 'fk' ( 'SnippetConfigKey' ),
Constraint 'fk' foreign key ('SnippetConfigKey' ) references 'SnippetConfig' ('SnippetKey' )...
非常感谢任何建议。
答案 0 :(得分:1)
NHibernate中的映射字典可能有点棘手。请在此处查看详细说明:Ayende's post about <map>
。
了解它的关键在于TKey
和TValue
(IDictionary<TKey, TValue>
)的映射
<index>
元素因为您的TKey
是字符串:
public virtual IDictionary<string, SnippetConfigParam> Params { get; set; }
表示它的映射不能是 int
<index column="SnippetValueKey" type="Int32"/>
将 Params proeprty更改为IDictionary<int, SnippetConfigParam>
,它应该有效。
注意:如果要填充类SnippetConfigParam的属性SnippetValueKey,请扩展组件
<composite-element class ="SnippetConfigParam">
<property name="SnippetValueKey" formula="SnippetValueKey "
insert="false" update="false" />
<property name="ParamName" />
<property name="Value" />
</composite-element>