유창한 nhibernate의 ID 필드로 클래스와 함께 Composite-ID를 어떻게 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1203078

문제

다음과 같은 매핑 파일이 있습니다.

<class name="Resource" table="resource" discriminator-value="null">
    <composite-id name="Key" class="Models.Bases.ClientKey, Models">
        <key-property name="Id" column="ID" type="int"/>
        <key-property name="SiteId" column="clientID" type="int"/>
    </composite-id>
    <property name="Name" type="String">
        <column name="`name`" length="500" sql-type="varchar" not-null="false"/>
    </property>
</class>

잘 작동하고 여기에 ID 클래스가 있습니다.

public class ClientKey
{
    public int Id { get; set; }
    public int ClientId { get; set; }
}

public class Resource
{
    public virtual ClientKey Key { get; set; }
    public virtual string Name { get; set; }
}

fluentnhibernate를 사용하여 이것을 어떻게 다시 찍을 수 있습니까? 이 코드는 작동하지 않습니다.

WithTable("resource");
UseCompositeId()
   .WithKeyProperty(x => x.Key.Id, "ID")
   .WithKeyProperty(x => x.Key.ClientId, "clientID");
Map(x => x.Name);

이 오류가 발생합니다 : 클래스 '모델에서'ID '를위한 getter를 찾을 수 없습니다.

감사!!!

도움이 되었습니까?

해결책

리소스 클래스를 수정하지 않으면 해결할 수 없을 까봐 두려워합니다. Fluent Nhibernate의 소스를 확인했습니다. Composite -ID 부품을 출력하는 코드는 다음과 같습니다.

XmlElement element = classElement.AddElement("composite-id");
foreach( var keyProp in keyProperties )
{
  keyProp.Write(element, visitor);
}

누락 된 것은 "이름"속성이며 "키"로 설정해야합니다. 이 Attible이 없으면 nhibernate 폴백을 기본 속성 이름 = "id"로 향합니다. 수업에는 ID 속성이 없으므로 NHibernate는 무엇을 해야할지 모르고 예외를 던졌습니다.

리소스 클래스를 수정할 수없는 경우이 클래스에 HBM 매핑을 사용하거나 유창한 nhibernate에 패치를 만들어야합니다 (이것은 알려진 문제이며 누군가가 그 일을 할 수 있습니다 - 유창한 nhibernate의 문제 추적기를 참조하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top