0

我正在为 ConfORM 编写我的第一个自定义列名称应用程序。

如何检查另一列是否已被映射具有相同的映射名称?

这是我到目前为止所拥有的:

public class MyColumnNameApplier : IPatternApplier<PropertyPath, IPropertyMapper>
{
    public bool Match(PropertyPath subject)
        {
            return (subject.LocalMember != null);
        }

        public void Apply(PropertyPath subject, IPropertyMapper applyTo)
        {
            string shortColumnName = ToOracleName(subject);
            // How do I check if the short columnName already exists?
            applyTo.Column(cm => cm.Name(shortColumnName));
        }

        private string ToOracleName(PropertyPath subject)
        {
            ...
        }
    }
}

我需要将生成的列名缩短到少于 30 个字符以适应 Oracle 的 30 个字符限制。因为我正在缩短列名,所以相同的列名可能会生成两个不同的属性。我想知道何时发生重复映射。

如果我不处理这种情况,ConfORM/NHibernate 允许两个不同的属性“共享”相同的列名——这显然会给我带来问题。

4

1 回答 1

0

如果列名被映射两次,您将在首次加载时获得有关参数计数的异常。配置后可以查看:

foreach (var clazz in config.ClassMappings)
{
    var propertiesWithOneColumn = clazz.PropertyClosureIterator.Where(p => p.ColumnSpan == 1);

    var distinctColumns = new HashSet<string>();
    foreach (var prop in propertiesWithOneColumn)
    {
        var col = prop.ColumnIterator.First().Text;
        if (distinctColumns.Add(col))
        {
            Console.WriteLine("duplicate column "+ col + " found for property " + prop.PersistentClass.ClassName + "." + prop.Name);
        }
    }
}
于 2012-11-28T14:19:36.267 回答