我正在为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允许两个不同的属性‘共享’相同的列名-这显然给我带来了一个问题。
发布于 2012-11-28 22:19:36
如果列名被映射了两次,你将在第一次加载时得到关于参数计数的异常。您可以在配置后进行检查:
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);
}
}
}https://stackoverflow.com/questions/13511233
复制相似问题