当我尝试使用NHibernate保存对象时,我收到错误“无效的索引...对于此SqlParameterCollection”。 我已经阅读了很多关于这些问题的答案,但他们要么是关于流利的NHB,要么似乎不适用于我的问题(我可能错了)。
这是我的朋友和我的班级:
<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;
}
}
(我没有看到这个继承的问题)
当我得到一个数据列表时,它工作正常。只有当我尝试保存它才会抛出异常(我还没有尝试删除)。
答案 0 :(得分:1)
您无法将两个属性映射到同一列。如果它们不同,NHibernate应如何决定使用哪个值?如果您确实需要多对一关系列的普通值作为单独的属性,那么将其映射为insert="false" update="false"
。