【问题标题】:NHibernate: Invalid index for this SqlParameterCollectionNHibernate:此 SqlParameterCollection 的索引无效
【发布时间】:2013-05-28 17:35:43
【问题描述】:

当我尝试使用 NHibernate 保存我的对象时,我收到一个错误“Invalid index... for this SqlParameterCollection”。 我已经阅读了很多关于这些问题的答案,但它们要么是关于 Fluent NHB,要么似乎不适用于我的问题(我可能错了)。

这是我的 hbm 和我的班级:

<class name="MyWebSite.Model.ADUser" table="AD_USER">
  <id name="Id" column="ID">
    <generator class="native"/>
  </id>
  <property name="Login" column="LOGIN"/>
  <property name="Hidden" column="HIDDEN"/>
  <many-to-one name="Resource" column="LOGIN" property-ref="Login" cascade="none" />
</class>

[DataContract()]
public class ADUser : Entity.AbstractPersistentObject
{
    [DataMember(EmitDefaultValue = false)]
    public virtual string Login { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual bool Hidden { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual AbstractHumanResource Resource { get; set; }
}

AbstractPersistentObject 不是我自己定义的类,我发现没有引用它的 hbm 文件,所以我猜它没有绑定到任何映射。 它具有“ID”属性的定义(我什至没有使用其他属性)。

[DataContract()]
public abstract class AbstractPersistentObject
{

    [DataMember(EmitDefaultValue = false)]
    public virtual int? Id { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual DateTime DateCreated { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual DateTime? DateUpdated { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual DateTime? DateDeleted { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual string CreatedBy { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual string UpdatedBy { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public virtual string DeletedBy { get; set; }

    public override int GetHashCode()
    {
        return !Id.HasValue ? base.GetHashCode() : string.Concat(this.GetType().FullName, Id.Value).GetHashCode();
    }

    public override bool Equals(object obj)
    {
        return obj == null ? false : obj.GetHashCode() == this.GetHashCode();
    }

    public override string ToString()
    {
        return this.GetType() + "#" + this.Id;
    }
}

(我没有看到这种继承的问题)

当我得到一个数据列表时,它工作正常。只有当我尝试保存它时它才会引发异常(我还没有尝试删除)。

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    您不能将两个属性映射到同一列。如果它们不同,NHibernate 应该如何决定使用哪个值?如果您真的需要多对一关系列的普通值作为单独的属性,请使用insert="false" update="false" 映射它。

    【讨论】:

    • 不 cascade="none" 提供相同的行为吗?
    • 我猜 cascade 会阻止 Resource 对象被保存,但不会禁用它们列本身的保存。谢谢。
    • @Serge 级联是一个完全不同的概念。 insert 和 update 属性只是说 NHibernate 忽略了 insert 和 update 语句的该属性。相反,级联是被引用实体应该或不应该改变的时候。所以 cascade="none" 只是说如果您的 ADUser 对象被插入/删除,NHibernate 不应该插入/删除 AbstractHumanResource 对象。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2011-06-20
    相关资源
    最近更新 更多