I have a database schema where the convention for a foreign key’s name is:
ForeignTable.Name + ForeignTable.PrimaryKeyName
So, for a Child table referencing a Parent table with a primary key column named Key, the foreign key will look like ParentKey.
Is there a way to create this convention in my Fluent NHibernate mapping?
Currently I’m using a ForeignKeyConvention implementation like this:
public class ForeignKeyNamingConvention : ForeignKeyConvention
{
protected override string GetKeyName(PropertyInfo property, Type type)
{
if (property == null)
{
// Relationship is many-to-many, one-to-many or join.
if (type == null)
throw new ArgumentNullException("type");
return type.Name + "ID";
}
// Relationship is many-to-one.
return property.Name + "ID";
}
}
This works exactly as I want for all types which have “ID” as a primary key. What I would like to do is replace the constant “ID” with the name of the primary key of the type being referenced.
If this isn’t currently possible with Fluent NHibernate, I’m happy to accept that answer.
If you can get the
Mapping<T>for a class, you can get the name of its Id column.We can get the Mapping object with a little bit of plumbing.
The constructors of
ClassMap<T>can passthisinto our collection of Mappers.For
AutoMapping<T>, we can use Override as follows.