1

我有一个 NHibernate 映射问题,我可以使用帮助 - 文档和示例对我来说似乎很不清楚。

我有一个类,其中包含另一个类的字典。我不确定正确的映射,并且我尝试过的所有操作要么无法映射,要么在读取数据时出现 NHibernate 异常。

2类是:

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:无法将“System.Int32”类型的对象转换为“System.String”类型。

所以我显然不明白一些事情。数据库表是:

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' )...

任何建议将不胜感激。

4

1 回答 1

1

在 NHibernate 中映射字典可能有点棘手。请参阅此处的详细说明:Ayende 关于<map>. 理解它的关键在于TKeyTValue( IDictionary<TKey, TValue>)的映射

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

因为你TKey字符串

public virtual IDictionary<string, SnippetConfigParam> Params { get; set; }

表示它的映射不能是int

<index column="SnippetValueKey"  type="Int32"/>

将Params属性更改为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>
于 2012-12-11T21:07:05.643 回答