NHibernate ERROR消息此SqlParameterCollection的索引4无效,Count = 4

时间:2015-01-12 13:07:17

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

  

NHibernate ERROR消息   此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 = ""          
    });
}

1 个答案:

答案 0 :(得分:4)

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

我们有一个实体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用于 ONE列用于两个属性 - 并且这样做不会起作用:

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期望一些params - 但有一个缺失。

解决方案? 制作其中一个只读

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