NHibernate 错误消息此 SqlParameterCollection 的索引 4 无效,计数 = 4

Far*_*rai 1 c# sql nhibernate asp.net-mvc

NHibernate 错误消息此 SqlParameterCollection 的索引 4 无效,Count=4。

我的映射:

public KazangAccountClassMap()
{
    Table("KazangAccount");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Channel).Not.Nullable();
    Map(x => x.UserName).Not.Nullable();
    Map(x => x.Password).Not.Nullable();
    HasMany<KazangMerchant>(x => x.KazangMerchants)
      .KeyColumn("AccountId")
      .Inverse();
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public ActionResult SaveChannelProperty(string NewProp, string ChannelName)
{
    client.CreateKazangChannelAttribute(new KazangChannelAttr
    {
        KazangChannelId = ChannelObject.Id,
        AttrName = NewProp,
        AttrValue = NewProp,
        AttrType = ""          
    });
}
Run Code Online (Sandbox Code Playgroud)

Rad*_*ler 5

这种异常几乎总是与“双重”映射有关。因为从问题中显示的片段来看并不容易显示,我会这样解释:

让我们有一个实体KazangAccount,它有提及Channel,也int表示该对象的ChannelId

public class KazangAccount
{
    public virtual int Id { get; set; }
    ...
    public virtual Channel Channel { get; set; }
    public virtual int ChannelId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们将指示 NHibernate为两个属性使用一列- 这将不起作用:

public KazangAccountClassMap()
{
    ...
    References(x => x.Channel)
       .Column("Channel_ID"); // the Channel reference
    Map(x => x.ChannelId)
       .Column("Channel_ID");      // the int property ChannleId
Run Code Online (Sandbox Code Playgroud)

该映射适用于任何 READ 操作...列将被使用两次。但是对于 WRITE 操作,我们将为列创建参数,为列创建Channel_ID另一个参数Channel_ID== 只会创建其中一个。虽然 NHibernate 期望一些参数计数 - 但缺少一个。

解决方案?将其中之一设为只读

public KazangAccountClassMap()
{
    ...
    References(x => x.Channel)
       .Column("Channel_ID"); // READ and WRITE
    Map(x => x.ChannelId)
       .Column("Channel_ID")  // just READ
       .ReadOnly()            // insert="false" update="false"
       ; 
Run Code Online (Sandbox Code Playgroud)

现在,NHibernate 将只为这一列创建/期望一个列/sqlParamter...