NHibernate - 带有Count(按代码映射)的此SqlParameterCollection的索引无效

时间:2013-11-17 11:47:58

标签: nhibernate

我在我的一个班级中遇到了NHibernate Mapping By Code和一个复合键的真正问题。

Domain类如下: -

    public partial class UserRole {
    public virtual int UserId { get; set; }
    public virtual int RoleId { get; set; }
    //public virtual UserRoleId Id { get; set; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    [NotNullNotEmpty]
    public virtual DateTime VqsCreateDate { get; set; }
    public virtual DateTime? VqsUpdateDate { get; set; }
    [NotNullNotEmpty]
    public virtual bool VqsMarkedForDelete { get; set; }
    [Length(50)]
    public virtual string VqsCreateUserName { get; set; }
    [Length(50)]
    public virtual string VqsLastUpdatedUserName { get; set; }
    [NotNullNotEmpty]
    [Length(128)]
    public virtual string VqsCreateSessionId { get; set; }
    [Length(128)]
    public virtual string VqsLastUpdatedSessionId { get; set; }
    [NotNullNotEmpty]
    [Length(15)]
    public virtual string VqsCreateIpAddress { get; set; }
    [Length(15)]
    public virtual string VqsLastUpdatedIpAddress { get; set; }
    [Length(255)]
    public virtual string VqsCreateSessionInfo { get; set; }
    [Length(255)]
    public virtual string VqsLastUpdatedSessionInfo { get; set; }
    [NotNullNotEmpty]
    public virtual bool VqsAllowDelete { get; set; }
    public virtual bool? VqsAllowEdit { get; set; }
    [Length(50)]
    public virtual string VqsRffu1 { get; set; }
    [Length(50)]
    public virtual string VqsRffu2 { get; set; }
    [Length(50)]
    public virtual string VqsRffu3 { get; set; }
    #region NHibernate Composite Key Requirements
    public override bool Equals(object obj) {
        if (obj == null) return false;
        var t = obj as UserRole;
        if (t == null) return false;
        if (UserId == t.UserId
         && RoleId == t.RoleId)
            return true;

        return false;
    }
    public override int GetHashCode() {
        int hash = GetType().GetHashCode();
        hash = (hash * 397) ^ UserId.GetHashCode();
        hash = (hash * 397) ^ RoleId.GetHashCode();

        return hash;
    }
    #endregion
}

映射类如下: -

   public partial class UserRoleMap : ClassMapping<UserRole> {

    public UserRoleMap() {
        Schema("Membership");
        Lazy(true);
        ComposedId(compId =>
            {
                compId.Property(x => x.UserId, m => m.Column("UserId"));
                compId.Property(x => x.RoleId, m => m.Column("RoleId"));
            });
        Property(x => x.VqsCreateDate, map => map.NotNullable(true));
        Property(x => x.VqsUpdateDate);
        Property(x => x.VqsMarkedForDelete, map => map.NotNullable(true));
        Property(x => x.VqsCreateUserName, map => map.Length(50));
        Property(x => x.VqsLastUpdatedUserName, map => map.Length(50));
        Property(x => x.VqsCreateSessionId, map => { map.NotNullable(true); map.Length(128); });
        Property(x => x.VqsLastUpdatedSessionId, map => map.Length(128));
        Property(x => x.VqsCreateIpAddress, map => { map.NotNullable(true); map.Length(15); });
        Property(x => x.VqsLastUpdatedIpAddress, map => map.Length(15));
        Property(x => x.VqsCreateSessionInfo, map => map.Length(255));
        Property(x => x.VqsLastUpdatedSessionInfo, map => map.Length(255));
        Property(x => x.VqsAllowDelete, map => map.NotNullable(true));
        Property(x => x.VqsAllowEdit);
        Property(x => x.VqsRffu1, map => map.Length(50));
        Property(x => x.VqsRffu2, map => map.Length(50));
        Property(x => x.VqsRffu3, map => map.Length(50));
        ManyToOne(x => x.User, map =>
        {
            map.Column("UserId");
            ////map.PropertyRef("Id");
            map.Cascade(Cascade.None);
        });

        ManyToOne(x => x.Role, map =>
        {
            map.Column("RoleId");
            ////map.PropertyRef("Id");
            map.Cascade(Cascade.None);
        });

    }
}

每当我尝试插入此表时,都会出现以下错误: -

  

此SqlParameterCollection的索引无效,计数为“N”

我已经在StackExchange和最后一天的大部分互联网上看到了这个错误的所有出现,但我仍然没有继续。

Xml和Fluent映射似乎有很多例子,但是按代码映射的情况很少。

我想我已尝试过各种建议,但都无济于事。

我完全清楚这个问题与我在表中引用两次ID字段的事实有关,这最终会导致错误,

问题在于我需要在我的课程中使用ID和实体字段,因为它们在整个代码中被广泛使用。

我似乎遇到了这个问题,因为我在多对多表中都有复合键和外键的组合。

任何人都可以提供任何保护我的理智的帮助将非常感激。

非常感谢提前。

西蒙

1 个答案:

答案 0 :(得分:1)

您可以设置Insert(false)Update(false)以防止Nhibernate生成包含“用户”和“角色”列(不存在)的更新或插入语句。

        ManyToOne(x => x.User, map =>
        {
            map.Column("UserId");
            ////map.PropertyRef("Id");
            map.Cascade(Cascade.None);
            map.Insert(false);
            map.Update(false);
        });

        ManyToOne(x => x.Role, map =>
        {
            map.Column("RoleId");
            ////map.PropertyRef("Id");
            map.Cascade(Cascade.None);
            map.Insert(false);
            map.Update(false);
        });

这与Fluent映射中的Not.Update() Not.Insert()相同。

如果您现在创建一个有效的UserRole对象并将bot ID设置为有效的用户/角色ID,NHibernate应该能够保留您的对象。