Свободное владение NHibernate - присоединенный подкласс ForeignKey Name - PullRequest
5 голосов
/ 17 января 2011

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

У кого-нибудь есть решение для этого или обходной путь?

Я нашел этот пост , но предложение явно не было добавлено в код.

Я бы хотел, по возможности, не настраивать код самостоятельно.

Любая помощь будет великолепна ...

Пример:

public class Product
{
    public string Name { get; set; }
}

public class Hammer : Product
{
    public string Description { get; set; }
}

public class ProductMap : ClassMap<Product, long>
{
    public ProductMap()
    {
        Polymorphism.Implicit();
        Map(x => x.Name);
    }
}

public class HammerMap : SubclassMap<Hammer>
{
    public HammerMap()
    {
        Extends<Product>();
    }
}

Это генерирует что-то вроде:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="field.camelcase-underscore" auto-import="false" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" mutable="true" polymorphism="implicit" optimistic-lock="version" name="Domain.Product, Domain" table="Product">
    <id name="Id" type="System.Int64">
      <column name="Id" />
      <generator class="native">
        <param name="sequence">ProductId</param>
      </generator>
    </id>
    <property name="Name" type="System.String">
        <column name="Name" />
    </property>
    <joined-subclass name="Domain.Hammer, Domain" table="Hammer">
      <key>
        <column name="Product_Id" />
      </key>
        <property name="Description" type="System.String">
          <column name="Description" />
        </property>
    </joined-subclass>
  </class>
</hibernate-mapping>

Обратите внимание, что в файле hbm для сопоставления не указано имя внешнего ключа - как в:

<joined-subclass name="Domain.Hammer, Domain" table="Hammer">
   <key column="Product_Id" foreign-key="FK_Hammer_Product"/>
</joined-subclass>

1 Ответ

5 голосов
/ 19 января 2011

Попробуйте что-то вроде этого

public class JoinedSubclassForeignKeyConvention : IJoinedSubclassConvention
{
   public void Apply(IJoinedSubclassInstance instance)
   {
      instance.Key.ForeignKey(string.Format("FK_{0}_{1}", 
                    instance.EntityType.Name, instance.Type.Name));
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...