Използвайки 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!