NHibernate映射了一个IDictionary问题

时间:2012-12-11 20:11:51

标签: c# asp.net-mvc nhibernate

我有一个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' )...

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

NHibernate中的映射字典可能有点棘手。请在此处查看详细说明:Ayende's post about <map>。 了解它的关键在于TKeyTValueIDictionary<TKey, TValue>)的映射

  • TKey由<index>元素
  • 表示
  • TValue可以是元素,复合元素,一对多

因为您的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>