Ответ 1
Я не знаю, поддерживает ли FluentNH, но XML прост:
<joined-subclass name="Cat">
<key column="AnimalId" foreign-key="NameOfTheFK"/>
</joined-subclass>
Я думаю, что это должно быть просто, но я не могу понять, как это сделать. Предположим, что у меня есть следующие карты:
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, если на то пошло).
Итак, что мне не хватает?
Я не знаю, поддерживает ли FluentNH, но XML прост:
<joined-subclass name="Cat">
<key column="AnimalId" foreign-key="NameOfTheFK"/>
</joined-subclass>
Свободный NH позволяет это:
public class ReferenceConvention : IReferenceConvention{
public void Apply(IManyToOneInstance instance) {
instance.ForeignKey(string.Format("FK_{0}_{1}",
instance.EntityType.Name,
instance.Name));
}
}
Вам также необходимо реализовать IHasManyConvention
и IHasManyToManyConvention
так же, как указано выше.
У меня была та же проблема, для меня хорошо работает следующее:
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