Как я могу использовать составной идентификатор с классом в качестве поля идентификатора в беглом nhibernate? - PullRequest
0 голосов
/ 30 июля 2009

У меня есть файл сопоставления, такой как:

<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' в классе 'Models.Resource'

Спасибо !!!

1 Ответ

1 голос
/ 30 июля 2009

Боюсь, вы не сможете это исправить, не изменив класс ресурса. Я проверил с исходным кодом Fluent NHibernate - вот как выглядит код, который выводит составной идентификатор:

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

Чего не хватает, так это атрибута «name», который должен быть установлен в «Key». Без этого атрибут NHibernate возвращается к свойству по умолчанию name = "Id". Поскольку у вашего класса нет свойства Id, NHibernate не знает, что делать, и выдает исключение.

Если вы не можете изменить класс Resource, вам придется использовать отображение hbm для этого класса или создать патч, чтобы свободно использовать nhibernate (возможно, это известная проблема, и кто-то над ней работает - обратитесь к трекеру проблем беглого nhibernate ).

...