3

抽象基本クラスから継承されたプロパティにNHibernateがアクセスできないのはなぜですか。句のaQueryOverでプロパティを使用しようとすると、取得しますWhere

プロパティを解決できませんでした:ID:TheWorkshop.Web.Models.Customer

var customer = Session.QueryOver<Customer>()
                      .Where(c=>c.ID ==id)
                      .SingleOrDefault<Customer>();

Intelisenseは、クエリの作成とソリューションのコンパイルを支援してくれたので、クラスにプロパティがあります。Customerのプロパティは、保護されたフィールドを公開するから継承する抽象クラスから継承されます。IDCustomerIDContactDomainEntity<T>

public abstract class DomainEntity<T>
{
    protected Guid _persistenceId;
    //... 
}

public abstract class Contact : DomainEntity<Contact>
{
    public virtual Guid ID
    {
        get { return _persistenceId; }
    }

    public virtual Address Address
    {
        get { return _address; }
        set { _address = value; }
    }

    //... 
}

およびマッピングファイル内

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                   assembly="TheWorkshop.Web" 
                   namespace="TheWorkshop.Web.Models" 
                   default-access="field.camelcase-underscore" 
                   default-lazy="true">
    <class name="Contact" table="Contacts" abstract="true">
        <id name="_persistenceId" column="ID" type="Guid" access="field" 
            unsaved-value="00000000-0000-0000-0000-000000000000">
        <generator class="guid.comb" />
        </id>
        <!-- ... -->
        <union-subclass name="Customer" table="Customers">

から更新した同様の質問への回答に続いて、私はまだ同じ問題を抱えています。NHibernate 3.3.3-CR1NHibernate 3.3.2.4000

4

1 に答える 1

0

問題は、NHibernateが私のマッピングからIDプロパティを解決する方法を推測できなかったことです。したがって、クラスは正常にコンパイルさ_persistenceIdれ、抽象基本クラスのプロパティには実装クラスのaを介してアクセスできましたが、とNHibernategetterの間の名前の不一致のため、それに従うことができませんでした。_persistenceIdID

(より簡単な)解決策は、私の名前を一致するように変更することでした。IProperyAccessorIGetter、およびISetterインターフェイスを実装し、アクセス戦略IDを使用するために文字列を渡すためのパスを提供することを含む、より難しいソリューションがあります。ClassName

2つの解決策のうち、より単純なのは、名前をに変更_persistenceIdする_id(そしてそれに対するすべての参照を更新する)ことでした。

<id name="_persistenceId" column="ID" type="Guid" access="field" 
    unsaved-value="00000000-0000-0000-0000-000000000000">

になります

<id name="Id" column="Id" type="Guid" 
    unsaved-value="00000000-0000-0000-0000-000000000000">

access="field"更新されたIDマッピングにドロップすることもできたことに注意してください

于 2013-03-03T16:40:34.907 に答える