2012-11-22 28 views
0

我正在爲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個字符以配合Oracle的30個字符的限制。因爲我縮短了列名,所以有可能相同的列名可能會生成兩個不同的屬性。我想知道重複映射何時發生。

如果我不處理這種情況,ConfORM/NHibernate允許兩個不同的屬性'共享'相同的列名 - 這顯然會給我造成一個問題。

回答

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); 
     } 
    } 
} 
相關問題