Currently this only works with SQL Server, but I believe that this approach should also be possible in other databases.
using System.Linq; using System.Text; using Iesi.Collections.Generic; using NHibernate.Dialect; using NHibernate.Mapping; namespace Conventions { public class CustomPrimaryKeyIndexNameConvention { public static void CreateUpdatePkNameScript(NHibernate.Cfg.Configuration config) { var script = new StringBuilder(""); script.AppendLine("DECLARE @keyName AS SYSNAME"); script.AppendLine(); foreach (var tableName in config.ClassMappings.Select(m => m.Table.Name).Distinct()) { script.AppendFormat(string.Format("SELECT @keyName = name FROM sys.key_constraints kc WHERE kc.parent_object_id = OBJECT_ID('dbo.{0}', 'U')", tableName)); script.AppendLine(); script.AppendFormat("EXEC sp_rename @keyName, N'PK_{0}', N'OBJECT';", tableName); script.AppendLine(); } config.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(script.ToString(), null, new HashedSet<string> { typeof(MsSql2000Dialect).FullName, typeof(MsSql2005Dialect).FullName, typeof(MsSql2008Dialect).FullName })); } } }As you can see, the convention is to use “PK_<TableName>” for the PK name and is applied using the Auxiliary database extensions:
.ExposeConfiguration(CustomPrimaryKeyIndexNameConvention.CreateUpdatePkNameScript)
No comments:
Post a Comment