【问题标题】:fluent nhibernate suppress loading reference流利的休眠抑制加载参考
【发布时间】:2012-05-31 00:58:48
【问题描述】:

我正在使用 fluent nhibernate 加载 POCO 类。 我正在使用 ClassMap 衍生物来指定映射。 我正在使用这样的配置:

.Mappings(m => m.FluentMappings
  .AddFromAssemblyOf<MyClass>()
  .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never())
  /** I am using Never() because I have poco classes, not virtual properties **/
)

我希望发出一个查询,该查询将加载具有特定父 ID 的所有子实体,而不填充父实体 - 父实体 大量

查询

如何使用条件或其他映射或提示发出此查询,但不加载父对象。 我希望更好地控制加载的内容。 它不必是 linq 提供者。

var results = _session.Query<Child>().Where(_ => _.Parent.Id == ?).ToList();

父级

public ParentMap()
{
  Table("Parent");
  Id(x => x.Id).Column("ParentId");
  HasMany(x => x.Children)
    .Table("Children")
    .KeyColumn("ChildId").Inverse()
}

孩子

public ChildMap()
{
  Table("Child");
  Id(_ => _.Id).Column("ChildId");
  References(_ => _.Parent).Column("PartyId").LazyLoad(Laziness.NoProxy);
}

【问题讨论】:

    标签: c# wcf nhibernate poco lazy-loading


    【解决方案1】:

    您可以只查询子实体:

    var query = _session.QueryOver<Child>()
       .Where(x=>x.Parent.Id==id)
       .List();
    

    或进行更精细的控制 - 使用投影和 AliasToBean() 转换器。比如:

    ChildDTO dto = null;
    var query = _session.QueryOver<Child>()
    .Where(x=>x.Parent.Id==id)
    .SelectList(list=>list
       .Select(x=>x.SomeProperty).WithAlias(()=>dto.SomeProperty)
       .Select(x=>x.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty))
    .TransformUsing(Transformers.AliasToBean<ChildDTO>())
    .List<ChildDTO>();
    

    ChildDTO dto = null;
    Child childAlias = null;
    var query = _session.QueryOver<Parent>()
    .JoinAlias(x=>x.Children, ()=>childAlias, JoinType.InnerJoin)
    .Where(x=>x.Id==id)
    .SelectList(list=>list
       .Select(x=>childAlias.SomeProperty).WithAlias(()=>dto.SomeProperty)
       .Select(x=>childAlias.SomeOtherProperty).WithAlias(()=>dto.SomeOtherProperty))
    .TransformUsing(Transformers.AliasToBean<ChildDTO>())
    .List<ChildDTO>();
    

    【讨论】:

    • 如果 Child 不能被代理,则 Parent 不能被延迟加载,所以需要第二个选项
    • 嗨,看起来唯一的解决方案,不过我的最后一个问题是,别名是否可以应用于原始 Child 而不是 ChildDTO。您能否只使用必填字段填充原始实例,而不必为每个属性设置别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多