我使用 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 通常为空,我认为这是因为大多数时候引用是单向的,而且我对关系的另一端不感兴趣,除了我需要使用稳定的键名。鉴于“另一面”为空,我无法为该键设置外键约束名称。
有谁知道如何实现完全稳定的约束名称,理想情况下基于所涉及的实际列/表?