使用Fluent NHibernate的AutoPersistenceModel,但在单个对象中加载

时间:2009-05-05 15:36:44

标签: nhibernate fluent-nhibernate eager-loading

我正在使用Fluent NHibernate来自动映射我的实体。

这是我用于自动映射的代码:

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)来标记我想要加载的对象。

任何人都可以帮忙怎么做?请记住,我想保留自动映射功能。

由于

1 个答案:

答案 0 :(得分: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();
  }
}