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)
        {
            ...
        }
    }
}

Oracle の 30 文字制限に適合するように、生成された列名を 30 文字未満に短縮する必要があります。列名を短くしているため、同じ列名が 2 つの異なるプロパティを生成する可能性があります。重複マッピングがいつ発生するかを知りたいです。

このシナリオを処理しない場合、ConfORM/NHibernate は 2 つの異なるプロパティが同じ列名を「共有」することを許可します。これは明らかに問題を引き起こします。

4

1 に答える 1

0

列名が 2 回マップされている場合、最初の読み込みでパラメーター数に関する例外が発生します。構成後に確認できます。

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 に答える