SQL Producer - PK和FK约束命名

时间:2016-06-30 10:46:19

标签: codefluent

我们在运行数据透视文件时遇到了问题。看起来我们的PK和FK的命名冲突(如this)就遭遇了。

我们的用例是我们创建了新表(比如tableAB),但由于命名冲突,PK(比如PK_tableA)没有被创建,因为另一个表(比如tableAB)已经有了这个PK(PK_tableA) )定义。由于FK引用tableAB上不存在的PK,枢轴将停止处理。

有没有办法重命名PK和FK约束?特别是我们已经使用了一个自定义类来覆盖SoftFluent.Samples.CustomNamingConvention.FormatNamingConvention,但这似乎只适用于DF_约束(参见here)。 我想用PK和FK约束来实现同样的东西,最好的解决方案是什么?

编辑08/07/2016

终于通过对象投射找到了我的方式。下面的代码生成具有预期命名的约束:

 public override string GetShortName(IShortNamedObject obj, IDictionary context)
 {
        Object objCopy = obj;
        if (objCopy is Constraint)
        {
            Constraint constraint = objCopy as Constraint;
            if (constraint != null && constraint.Table != null)
            {
                if (constraint.ConstraintType == ConstraintType.PrimaryKey || constraint.ConstraintType == ConstraintType.ForeignKey)
                {
                    var result = constraint.Table.Name + base.GetShortName(obj, context);
                    return result;
                }
            }

        }
        return base.GetShortName(obj, context);
 }

感谢您提供的支持。

1 个答案:

答案 0 :(得分:1)

命名约定可以支持许多不同类型的名称(完整,简短,显示等),具体取决于推理管道处理的抽象概念(约束,表,过程等)的类型,这是怎么回事定义CodeFluent的INamingConvention(在CodeFluent.Model.Common.Naming命名空间中):

public interface INamingConvention
{
    string GetName(INamedObject obj, IDictionary context);
    string GetShortName(IShortNamedObject obj, IDictionary context);
    string GetFullName(IFullNamedObject obj, IDictionary context);
    string GetDisplayName(IDisplayNamedObject obj, IDictionary context);
    string GetClrFullTypeName(IClrFullTypeNamedObject obj, IDictionary context);
    string GetPersistenceName(IPersistenceNamedObject obj, IDictionary context);
    string GetPersistenceShortName(IPersistenceShortNamedObject obj, IDictionary context);
}

约束使用短名称和全名,因此如果您派生自FormatNamingConvention(实现INamingConvention),则应覆盖GetShortName和/或GetFullName方法并将obj转换为Constraint

请注意,短名称存在很多问题是不常见的,或者您的所有实体可能会在模型版本中反复使用相同的名称。您还可以使用persistenceShortNameLength属性调整短名称长度(默认情况下设置为3):CodeFluentRuntimeException (CF1024): Cannot determine short name

相关问题