代码之家  ›  专栏  ›  技术社区  ›  Miki Watts

wcf序列化和nhibernate延迟加载

  •  2
  • Miki Watts  · 技术社区  · 17 年前

    我使用的是.net 2.0、NHibernate/ActiveRecord和WCF。

    到目前为止,我还没有使用NH Lazy加载,但性能损失太大,不容忽视,所以我开始使用它。

    使用我在这里找到的代码: WCF Serialization With NHibernate

    public override XmlObjectSerializer CreateSerializer(Type standard, XmlDictionaryString name, XmlDictionaryString NS, IList<Type> knownTypes)
    {
        return new DataContractSerializer(standard, name, NS, knownTypes, 0x989680, false, true /* Preserve References*/, new HibernateDataContractSurrogate());
    }
    

    我的问题是当我有这样的事情时:

    [DataContract, ActiveRecord("POS_POSCUSTOMERS",Lazy = true)]
    public class POSCustomer : ActiveRecordForPOS<POSCustomer>
    {
        private Branch belongsToBranch;
    
        [DataMember,BelongsTo("BRANCH")]
        public virtual Branch BelongsToBranch
        {
            get { return belongsToBranch; }
            set { belongsToBranch = value; }
        }
    }
    

    [DataContract, ActiveRecord("BRANCHES",Lazy = true)]
    public class Branch : ActiveRecordForPOS<Branch>
    {
        private POSCustomer defaultPOSCustomer;
    
        [DataMember, BelongsTo("POS_POSCUSTNUM", Cascade= CascadeEnum.None)]
        public virtual POSCustomer DefaultPOSCustomer
        {
            get { return defaultPOSCustomer; }
            set { defaultPOSCustomer = value; }
        }
    }
    

    分行。默认POS客户和POS客户。BelongsToBranch是两个不相关的实体,但它们是相同的实体,例如,Branch 200有DefaultPOSCustomer 100,POSCustomers有BelongsToCranch 200。

    如果我在这些类上关闭Lazy=true,序列化就可以正常工作。

    1. 我该如何制止这种行为?

    附言:我一直在考虑另一种解决方案,即创建类似于NHibernate Proxy的东西,但用原始键替换与其他类相关的属性,这样我就可以有一个值为200的int类型的属性,而不是Branch类型的属性。这样我也许可以避免遇到的循环问题,但我会把这作为最后的手段,因为维护起来会非常复杂。

    编辑:好吧,直接采用NH/AR/WCF的方式运气不好。我将继续创建DTO,这似乎更容易。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Miki Watts    16 年前

        2
  •  0
  •   queen3    16 年前

    一种解决方案是覆盖。Equals()用于比较持久实体的Id属性。我想你的实体有类似主键的东西。这可能会让WCF高兴,只要它使用等式,而不是引用比较。如果WCF总是使用ReferenceEquals,那就倒霉了。

        3
  •  0
  •   Community Mohan Dere    9 年前

    我们一直在使用 this 解决方案,并发现它比DTO解决方案更容易/更好。

    推荐文章