代码之家  ›  专栏  ›  技术社区  ›  George Mauer

NHibernate:如何测试多对一关系是懒惰的?

  •  1
  • George Mauer  · 技术社区  · 15 年前

    我有一个简单的多对一关系(一个订单有一个下订单的客户)。以下是我的订单映射中的例外:

    <many-to-one name="Customer" column="FK_CUSTOMERS" class="MyApp.Customer, MyApp" 
    not-null="true" lazy="proxy" cascade="none" />
    

    configuration.GetClassMapping(typeof(Order))
      .ReferenceablePropertyIterator.FirstOrDefault(p=>p.Name=="Customer")
      .IsLazy
      .ShouldBeTrue();
    

    1 回复  |  直到 15 年前
        1
  •  1
  •   dotjoe    15 年前

    我在看来源,看起来有点奇怪。这是2010年1月26日的最后一次变动

    get
                {
    -               if (propertyValue is ToOne)
    -               {
    -                   // both many-to-one and one-to-one are represented as a
    -                   // Property.  EntityPersister is relying on this value to
    -                   // determine "lazy fetch groups" in terms of field-level
    -                   // interception.  So we need to make sure that we return
    -                   // true here for the case of many-to-one and one-to-one
    -                   // with lazy="no-proxy"
    -                   //
    -                   // * impl note - lazy="no-proxy" currently forces both
    -                   // lazy and unwrap to be set to true.  The other case we
    -                   // are extremely interested in here is that of lazy="proxy"
    -                   // where lazy is set to true, but unwrap is set to false.
    -                   // thus we use both here under the assumption that this
    -                   // return is really only ever used during persister
    -                   // construction to determine the lazy property/field fetch
    -                   // groupings.  If that assertion changes then this check
    -                   // needs to change as well.  Partially, this is an issue with
    -                   // the overloading of the term "lazy" here...
    -                   ToOne toOneValue = (ToOne)propertyValue;
    -                   return toOneValue.IsLazy && toOneValue.UnwrapProxy;
    -               }
    +               // NH Specific: Hibernate doesn't make a distinction between
    +               // lazy and no-proxy, but NHibernate does. While Hibernate tracks
    +               // just whatever a property is lazy, we need to track lazy/no-proxy seperatedly.
    +               
                    return isLazy;
                }
    

    因此,这取决于您使用的版本,但是如果您将其映射为 noproxy (即展开)。这给了你什么?

    var to1 = configuration.GetClassMapping(typeof(Order))
      .ReferenceablePropertyIterator.FirstOrDefault(p=>p.Name=="Customer")
      .Value as NHibernate.Mapping.ToOne;
    
    to1.IsLazy.ShouldBeTrue();
    to1.UnwrapProxy.ShouldBeFalse();