Проверьте существующее сопоставление при написании пользовательского аппликатора в Conform
Я пишу свой первый настраиваемый аппликатор имени столбца для 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 символов, чтобы соответствовать ограничению 30 символов Oracle. Поскольку я сокращаю имена столбцов, возможно, что одно и то же имя столбца потенциально может быть сгенерировано двумя разными свойствами. Я хотел бы знать, когда происходит дублирование сопоставления.
Если я не обработаю этот сценарий, ConfORM/NHibernate позволяет двум разным свойствам "совместно использовать" одно и то же имя столбца - это, очевидно, создает для меня проблему.
1 ответ
Если имена столбцов отображаются дважды, вы получите исключение в отношении количества параметров при первой загрузке. Вы можете проверить после настройки:
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);
}
}
}