0

在运行数据透视文件时,我们的模型遇到了问题。看来我们在 PK 和 FK 上遇到了命名冲突(就像在这个中一样)。

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

有没有办法重命名 PK 和 FK 约束?特别是我们已经使用了一个覆盖 SoftFluent.Samples.CustomNamingConvention.FormatNamingConvention 的自定义类,但这似乎只适用于 DF_ 约束(参见此处)。我想通过 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);
 }

感谢提供的支持。

4

1 回答 1

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)派生,您应该覆盖GetShortNameand/orGetFullName方法并将其转换objConstraint.

请注意,短名称出现这么多问题是不寻常的,或者您的所有实体可能在跨模型版本中一遍又一遍地以相同的名称开头。您还可以使用以下属性调整短名称长度(默认设置为 3)persistenceShortNameLengthCodeFluentRuntimeException (CF1024):无法确定短名称

于 2016-06-30T22:04:18.467 回答