我们在运行数据透视文件时遇到了问题。看起来我们的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);
}
感谢您提供的支持。
答案 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