By default, NHibernate will assume that foreign keys should be named using the convention ReferencedTableName_id (e.g. Person_id). I personally don’t like this conversion and would prefer ReferencedTableNameId (e.g. PersonId).
Fortunately, this is pretty easy to achieve by extending the ForeignKeyConvention class in Fluent NHibernate:
using System; using FluentNHibernate; using FluentNHibernate.Conventions; namespace NHibernate.Helpers.Conventions { public class CustomForeignKeyConvention : ForeignKeyConvention { protected override string GetKeyName(Member property, System.Type type) { if (property != null) { return property.Name + "Id"; } if (type != null) { return type.Name + "Id"; } // If both are null, we throw an exception: throw new ArgumentNullException("property", "The property and type parameters cannot both be null"); } } }
This needs to be wired into your SessionFactory creation code as follows:
sessionFactory = Fluently.Configure() .Database(DatabaseConfiguration) .Mappings(x => x.FluentMappings.AddFromAssembly(MappingsAssembly)) .Mappings(x => x.FluentMappings.Conventions.Add(new CustomForeignKeyConvention())) .ExposeConfiguration(x => new SchemaUpdate(x).Execute(false, true)) .BuildSessionFactory();
Note that the example above will also update the database schema.
Once you’ve done that, all foreign keys will use the desired naming convention.