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

发布于 2024-07-19 03:22:59 字数 1087 浏览 6 评论 0原文

我正在使用 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())
);

这工作得很好。 但现在我需要在我的域的一个对象中进行预加载。 找到此答案。 但是,当我将行 .ForTypesThatDeriveFrom(map => map.Not.LazyLoad()) 添加到代码中并运行它时,出现以下异常:

  • 尝试执行时出错为 IEagerLoading 构建映射文档

请注意,我正在使用一个接口 (IEagerLoading) 来标记我想要预先加载的对象。

谁能帮助如何做到这一点? 请记住,我想保留自动映射功能。

谢谢

I'm using Fluent NHibernate in order to auto map my entities.

This is the code I'm using for the auto mapping:

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())
);

This works just fine. But now I need to have Eager Loading in one single object of my domain. Found this answer. But when I add the line .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()) to the code and run it I get the following exception:

  • Error while trying to build the Mapping Document for IEagerLoading

Notice that I'm using an interface (IEagerLoading) to mark the objects that I want eager load.

Can anyone help how to do this? Remember that I want to keep the auto mapping functionality.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傾城如夢未必闌珊 2024-07-26 03:22:59

您遇到的问题是 ForTypesThatDeriveFrom 的命名有点误导性,它的真正含义是 ForMappingsOf,所以它试图找到一个 >ClassMap 显然不存在。

我相信您应该能够使用自定义的 IClassConvention 来处理这个问题。 这超出了我的想象,但应该有效:

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

  public void Apply(IClassMap target)
  {
    target.Not.LazyLoad();
  }
}

The problem you're hitting is that ForTypesThatDeriveFrom<T> is a bit misleadingly named, and that it really means ForMappingsOf<T>, so it's trying to find a ClassMap<IEagerLoading> which obviously doesn't exist.

I believe you should be able to handle this with a custom IClassConvention. This is off the top of my head, but should work:

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

  public void Apply(IClassMap target)
  {
    target.Not.LazyLoad();
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文