2012-03-26 62 views
0

最好問一個例子。假設我有這些映射:如何查詢NHibernate類映射以找出哪些實體可以引用另一個實體?

public class A 
{ 
    internal int Id { get; private set; } 

    public X X { get; set; } 

    internal class Map : ClassMap<A> 
    { 
     public Map() 
     { 
      Id(x => x.Id); 
      References(x => x.X); 
     } 
    } 
} 

public class B 
{ 
    internal int Id { get; private set; } 

    private IList<X> XList; 

    internal class Map : ClassMap<B> 
    { 
     public Map() 
     { 
      Id(x => x.Id); 
      HasMany(x => x.XList) 
       .Access.Field(); 

     } 
    } 
} 


public class X 
{ 
    protected internal virtual int Id { get; private set; } 

    internal class Map : ClassMap<X> 
    { 
     public Map() 
     { 
      Id(x => x.Id); 
     } 
    } 
} 

我正在尋找代碼,將接受一個NHibernate的(或FluentNHibernate)配置(或FluentConfiguration)對象,並輸出類似:

A - property member X 
B - field member XList 

顯然還有很多我沒有考慮像子類映射,三元關係,組件映射等,但我在尋找的是所有地方的列表,其中一個實體存儲在數據庫中時可能會引用另一個實體。

我試過看Configuration.ClassMappings類,但NHibernate.Mapping.RootClass是一個相當怪物,我很快就迷路了。有沒有人有任何關於如何做到這一點的指針(最好不必變得痛苦熟悉NHibernate映射代碼:)

回答

1

使用配置的AFAIK是這裏的方法。

var propertiesWithX = config.ClassMappings 
    .SelectMany(clazz => clazz.PropertyClosureIterator) 
    .Where(prop => prop.PropertyType == typeof(X) || IsCollectionOfTypeX(prop));