2016-08-09 63 views
1

我閱讀了很多關於禁用Fluent NHibernate延遲加載的文章,但是他們都沒有工作。我想全局禁用延遲加載。任何人都可以讓我知道如何做到這一點。如何在Fluent NHibernate中全局禁用延遲加載?

見下功能NHibernate配置:

_sessionFactory = Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(_connectionString) 
       .ShowSql()) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>() 
       .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never())) 
      .BuildSessionFactory(); 

回答

0

您可以添加全球IReferenceConvention刪除延遲加載特定的外鍵:

public class AggregateAttribute : Attribute { 
} 

public class ReferenceConvention : IReferenceConvention, IReferenceConventionAcceptance, IHasManyConvention, IHasManyConventionAcceptance { 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 

    public void Accept(IAcceptanceCriteria<IManyToOneInspector> criteria) { 
     criteria.Expect(x => x.Property != null && x.Property.MemberInfo.GetCustomAttributes(typeof(AggregateAttribute), false).Any()); 
    } 

    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 

    public void Accept(IAcceptanceCriteria<IOneToManyCollectionInspector> criteria) { 
     criteria.Expect(x => x.Member != null && x.Member.IsDefined(typeof(AggregateAttribute), false)); 
    } 
} 

使用綜合屬性爲:

public class FirstRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
    // Disable lazy load 
    [Aggregate] 
    public SecondRecord SecondRecord { get; set; } 
    // Lazy load 
    public ThirdRecord ThirdRecord { get; set; } 
} 

public class SecondRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

public class ThirdRecord { 
    public int Id { get; set; } 
    public int Name { get; set; } 
} 

此代碼將刪除任何屬性爲的延遲加載屬性就可以了,如果你想關閉延遲所有屬性,然後刪除該屬性和更新約定類是:

public class ReferenceConvention : IReferenceConvention, IHasManyConvention{ 
    public void Apply(IManyToOneInstance instance) { 
     instance.Fetch.Join(); 
    } 
    public void Apply(IOneToManyCollectionInstance instance) { 
     instance.Fetch.Select(); 
    } 
} 

有了這個代碼,NHibernate的會自動加載許多人通過參加相關記錄一個關係相同的查詢,以及單獨查詢的一對多查詢。

要使用它,簡單註冊新的約定:

.Conventions.Add(new ReferenceConvention()) 
+0

可否請你展示一些例子如何使用? –

+0

請參閱有關如何使用它的更新回答。 – mdameer

+0

仍會發生延遲加載。我想完全禁用延遲加載。所以,我的關聯屬性將爲null。 –