Используя 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>
В основном правила таковы:
- все является field-camelcase-underscore как тип доступа, ЗА ИСКЛЮЧЕНИЕМ идентификатора
- identity - это поле с фиксированным именем в каждом классе (name = _someSpecialIdentityField)
- идентификационный доступ всегда только для поля и не имеет никакого отношения к имени окружающего его свойства RO
Часть этого, которая меня полностью сбивает с толку, - это сопоставление по соглашению элементов, связанных с идентичностью (очевидно, что сопоставление свойств по соглашению является полностью стандартной платой за проезд). Проблема, с которой я столкнулся, заключается в том, как сообщить соглашениям FNH, что мое поле идентификации является фиксированным именем. Все переопределения соглашений, которые я могу найти, похоже, предполагают, что всегда будет некоторая связь между свойством, представляющим личность, и именем его базового поля поддержки (например, я могу установить «настраиваемый префикс» для поле поддержки, но я не понимаю, как я могу просто сказать: «это всегда имя поля поддержки»).
Для меня очевидно, как добиться этого с помощью явного сопоставления (и, если на то пошло, с помощью файлов сопоставления XML), но для меня совсем не очевидно, как это сделать с сопоставлением на основе соглашений (автоматическое сопоставление) в FNH.
Это не может быть нетипичным вариантом использования, поэтому я должен просто упустить из виду что-то ужасно очевидное. Мысли любых гуру FNH приветствуются!