【问题标题】:NHibernate ERROR Message Invalid index 4 for this SqlParameterCollection with Count=4NHibernate 错误消息 Invalid index 4 for this SqlParameterCollection with Count=4
【发布时间】:2015-01-12 13:07:16
【问题描述】:

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();
}

控制器:

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

【问题讨论】:

  • 这个错误很容易找到,也很容易修复,但是请显示完整的异常堆栈跟踪和与该错误相关的映射。

标签: c# sql asp.net-mvc nhibernate


【解决方案1】:

这种异常几乎总是与 "doubled" 映射有关。因为从问题中显示的sn-ps来看不容易显示,所以我会这样解释:

让我们有一个实体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; }
}

在这种情况下,我们将指示 NHibernate 将 一列 用于 两个属性 - 这是行不通的:

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

该映射适用于任何 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"
       ; 

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

【讨论】:

  • 如回答问题中所说,与双重映射有关。在我的例子中,它位于 SubclassMap 中。每个“子类”都映射相同的基本属性。
  • 如果你找到了方法就好了...... ;)
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2017-08-10
  • 2021-10-02
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多