유창한 nhibernate의 ID 필드로 클래스와 함께 Composite-ID를 어떻게 사용할 수 있습니까?
-
05-07-2019 - |
문제
다음과 같은 매핑 파일이 있습니다.
<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의 문제 추적기를 참조하십시오).
제휴하지 않습니다 StackOverflow