2013-05-28 31 views
0

當我嘗試使用NHibernate保存對象時,出現錯誤「此SqlParameterCollection的索引無效......」。 我已經閱讀了很多有關這些問題的答案,但他們要麼是關於流利的NHB,要麼似乎不適用於我的問題(我可能是錯的)。NHibernate:此SqlParameterCollection的索引無效

這裏是我的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」propery的定義(我甚至沒有使用其他的)。

[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; 
    } 
} 

(我沒有看到這種繼承問題)

當我得到的數據列表,它工作正常。只有當我試圖保存它時纔會拋出異常(我還沒有嘗試刪除)。

回答

1

您不能將兩個屬性映射到同一列。 NHibernate應該如何決定使用哪個值?如果您確實需要多對一關係列的普通值作爲單獨屬性,則將它映射爲insert="false" update="false"

+0

不級聯=「無」提供相同的行爲? – Serge

+0

我猜想級聯會阻止Resource對象被保存,但不會禁用它們自身的保存。謝謝。 – Serge

+0

@Serge級聯是一個完全不同的概念。插入和更新屬性只是說NHibernate忽略插入和更新語句的屬性。相反,級聯是指被引用實體應該或不應該改變的時間。所以cascade =「none」只是說如果您的'ADUser'對象被插入/刪除,NHibernate不應該插入/刪除'AbstractHumanResource'對象。 – cremor

相關問題