使用NHibernate/Fluent NHibernate设置外键约束名称

使用NHibernate/Fluent NHibernate设置外键约束名称,nhibernate,fluent-nhibernate,foreign-keys,Nhibernate,Fluent Nhibernate,Foreign Keys,我正在使用NHibernate和Fluent NHibernate作为我的应用程序的ORM。我经常使用导出模式生成数据库,然后与现有数据库进行比较。由于NHibernate生成了约束的名称,所以在比较时会产生很多噪音。所有表格每次都标记为已更改 我想使用一些约定(如FK_TableName_ColumnName)来稳定约束名称 然而,我无法让它工作 到目前为止,我已经做到了: public class ForeignConstraintNamingConvention : IReferenceC

我正在使用NHibernate和Fluent NHibernate作为我的应用程序的ORM。我经常使用导出模式生成数据库,然后与现有数据库进行比较。由于NHibernate生成了约束的名称,所以在比较时会产生很多噪音。所有表格每次都标记为已更改

我想使用一些约定(如FK_TableName_ColumnName)来稳定约束名称

然而,我无法让它工作

到目前为止,我已经做到了:

public class ForeignConstraintNamingConvention : IReferenceConvention, IHasManyConvention, IHasManyToManyConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        instance.ForeignKey(GetForeignConstraintName(instance.Name, instance.Columns.First().Name));
    }

    public void Apply(IOneToManyCollectionInstance instance)
    {
        if (instance.OtherSide != null)
        {
            instance.OtherSide.ForeignKey(GetForeignConstraintName(instance.TableName, instance.OtherSide.Columns.First().Name));
        }
    }

    private static string GetForeignConstraintName(string tableName, string columnName)
    {
        return string.Format("FK_{0}_{1}", tableName, columnName);
    }

    public void Apply(IManyToManyCollectionInstance instance)
    {
        if (instance.Relationship != null)
        {
            instance.Relationship.ForeignKey(string.Format("FK_{0}_{1}", instance.TableName, instance.Relationship.Columns.First().Name));
        }

        if (instance.OtherSide != null && instance.OtherSide.Relationship != null)
        {
            instance.OtherSide.Relationship.ForeignKey(GetForeignConstraintName(instance.OtherSide.TableName, instance.OtherSide.Relationship.Columns.First().Name));
        }
    }
}
但是instance.OtherSide通常为null,我假设这是因为引用大部分时间是单向的,我对关系的另一端不感兴趣,只是需要使用稳定的键名。考虑到“另一端”为空,我无法为该键设置外键约束名称

有没有人知道如何实现完全稳定的约束名称,最好是基于实际涉及的列/表