문제

다음 매핑이 있습니다. 다대일 속성 'Message'에는 'RootMessage' 클래스에 해당하는 일대다 연결이 있습니다.

<class name="IMessageReceipt" lazy="false" table="MessageReceipts" abstract="true">

        <id name="Id">
            <generator class="guid.comb"></generator>
        </id>

        <discriminator column="Discriminator"/>
        <property name="Address" />
        <property name="Status" />
        <property name="MarkedAsDeleted" />

        <many-to-one name="Message" column="MessageId" class="RootMessage" 
                not-found="ignore"/>

        <subclass name="MessageReceipt" lazy="false" discriminator-value="1">
        </subclass>

    </class>

다대일 연결은 기준 API를 사용할 때 로드를 거부합니다(내가 얻은 것은 모두 NULL입니다). 다음은 쿼리의 예입니다.

            List<IMessageReceipt> list;
        using (var tx = Session.BeginTransaction())
        {
            var criteria = Session.CreateCriteria(typeof (IMessageReceipt));
            criteria.Add(Restrictions.Eq("Address", address));
            criteria.Add(Restrictions.Eq("Status", status));
            criteria.SetFirstResult(0);
            criteria.SetMaxResults(quantity);
            list = criteria.List<IMessageReceipt>().ToList();
            tx.Commit();
        }
        return list;

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

좋아, 거의 하루 동안 억울함을 느낀 끝에 해결책을 찾았습니다.NHibernate는 두 엔터티 간의 양방향 연결을 자동으로 가정하지 않습니다. 둘 사이에 매핑이 있더라도.지속하기 전에 코드에서 연결을 반드시 선언해야 합니다.따라서:

message.Receipts = receipts;
foreach (var receipt in receipts)
{
   receipt.Message = message;
}
Session.Save(message);
tx.Commit();

또한 컬렉션 멤버가 있는 측면에는 inverse="true"를 적용해야 합니다.

<set name="Receipts" inverse="true" cascade="save-update">
<key column="MessageId"></key>
<one-to-many class="IMessageReceipt"/>
</set>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top