Используя Fluent NHibernate, я не могу разработать необходимые соглашения об автоматическом преобразовании для следующего (на первый взгляд простого и распространенного) варианта использования:
public class MyClass
{
private int _specialIdentityField
private string _firstname;
public Id { get { return _specialIdentityField; }; }
public virtual string Firstname
{
get
{
return _firstname;
}
set
{
_firstname = value;
}
}
}
public class OtherClass
{
private int _specialIdentityField
private string _lastname;
public Id { get { return _specialIdentityField; }; }
public virtual string Lastname
{
get
{
return _lastname;
}
set
{
_lastname = value;
}
}
}
Желаемые отображения выглядят так:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="field.camelcase-underscore" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="MyClass" table="`MyClass`">
<id name="_specialIdentityField" type="System.Int32" access=field>
<column name="Id" />
<generator class="identity" />
</id>
<property name="Firstname" type="System.String">
<column name="Firstname" />
</property>
</class>
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="OtherClass" table="`OtherClass`">
<id name="_specialIdentityField" type="System.Int32" access=field>
<column name="Id" />
<generator class="identity" />
</id>
<property name="Lastname" type="System.String">
<column name="Lastname" />
</property>
</class>
</hibernate-mapping>
В основном правила таковы:
- все является полем-верблюдом-подчеркиванием как тип доступа, КРОМЕ удостоверения
- идентификатор - это поле с фиксированным именем в каждом классе (name = _someSpecialIdentityField)
- идентификационный доступ всегда только для полей и имеет отношение нет к имени окружающего его свойства RO
Часть этого, которая полностью сбивает меня с толку, - это условное отображение элементов, связанных с идентичностью (ясно, что условное отображение свойств является полностью стандартной платой за проезд). Проблема, с которой я сталкиваюсь, заключается в том, как сообщить соглашениям FNH, что мое поле идентификатора является фиксированным именем. Все переопределения соглашения, которые я могу найти, по-видимому, предполагают, что всегда будет некоторая связь между свойством, которое представляет идентичность, и именем его базового вспомогательного поля (например, я могу установить «собственный префикс» для поле поддержки, но не могу понять, как я могу просто сказать «это всегда имя поля поддержки»).
Для меня очевидно, как выполнить это с явным отображением (и, в этом отношении, с файлами отображения XML), но для меня совершенно не очевидно, как сделать это с помощью сопоставления (Automapping) на основе соглашений в FNH.
Это не может быть нетипичным вариантом использования, поэтому я просто должен пропустить что-то ужасно очевидное. Мысли от любого гуру FNH оценили!