Fluent Nhibernate 1.0 - указать ограничение ограничения внешнего ключа между классом и объединенным подклассом

Я думаю, что это должно быть просто, но я не могу понять, как это сделать. Предположим, что у меня есть следующие карты:

public class AnimalMap : ClassMap<Animal> { Id( x => x.Id); }

public class CatMap: SubclassMap<Cat> {
    Extends<AnimalMap>();
    Map(x => x.IsDomestic);
}

Что создает таблицы, как я ожидаю:

Animal
------
Id

Cat
----
AnimalId : FK to Animal (named FK3500ABA0D)
IsDomestic

Как уже отмечалось, FK генерируется db и заканчивается как FK3500ABA0D. Все, что я хочу сделать, это установить имя этого ограничения, но я не могу найти, как это сделать с помощью Fluent NHibernate (или, фактически, даже простой NHibernate, если на то пошло).

Итак, что мне не хватает?

Ответ 1

Я не знаю, поддерживает ли FluentNH, но XML прост:

<joined-subclass name="Cat">
  <key column="AnimalId" foreign-key="NameOfTheFK"/>
</joined-subclass>

Ответ 2

Свободный NH позволяет это:

public class ReferenceConvention : IReferenceConvention{
     public void Apply(IManyToOneInstance instance) {
          instance.ForeignKey(string.Format("FK_{0}_{1}",
               instance.EntityType.Name,
               instance.Name));
     }
}

Вам также необходимо реализовать IHasManyConvention и IHasManyToManyConvention так же, как указано выше.

Ответ 3

У меня была та же проблема, для меня хорошо работает следующее:

public class JoinedSubclassForeignKeyConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        if (instance.Type.BaseType != null)
            instance.Key.ForeignKey(string.Format("FK_{0}_{1}", instance.EntityType.Name, instance.Type.BaseType.Name));
    }
}

Ваше ограничение внешнего ключа затем будет называться FK_Cat_Animal