2009-05-05 28 views
0

我使用流利NHibernate爲了自動映射我的實體。使用流利的NHibernate的AutoPersistenceModel,但在一個單一的對象中進行熱切加載

這是我使用自動映射代碼:

new AutoPersistenceModel() 
    .AddEntityAssembly(Assembly.GetAssembly(typeof(Entity))) 
    .Where(type => type.Namespace.Contains("Domain") && type.BaseType != null && type.BaseType.Name.StartsWith("DomainEntity") && type.BaseType.IsGenericType == true) 
    .WithSetup(s => s.IsBaseType = (type => type.Name.StartsWith("DomainEntity") && type.IsGenericType == true)) 
    .ConventionDiscovery.Add(
     ConventionBuilder.Id.Always(x => x.GeneratedBy.Increment()) 
); 

這一切正常。但現在我需要在我的域的單個對象中擁有Eager Loading。找到this answer。但是,當我添加了一行.ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad())的代碼並運行它,我得到以下異常:

  • 錯誤而試圖建立映射文檔的IEagerLoading

請注意,我使用的是界面(IEagerLoading)來標記我想要加載的對象。

任何人都可以幫助如何做到這一點?請記住,我想保留自動映射功能。

感謝

回答

3

你打的問題是,ForTypesThatDeriveFrom<T>是有點誤導命名,它的真正含義ForMappingsOf<T>,所以它試圖找到一個ClassMap<IEagerLoading>這顯然不存在。

我相信你應該可以用自定義的IClassConvention來處理這個問題。這是我的頭頂,但應該工作:

public class EagerLoadingConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
    return GetType().GetInterfaces().Contains(typeof(IEagerLoading)); 
    } 

    public void Apply(IClassMap target) 
    { 
    target.Not.LazyLoad(); 
    } 
} 
相關問題