代码之家  ›  专栏  ›  技术社区  ›  HelloSam

停止延迟加载还是跳过在nhibernate中加载属性?无法通过WCF序列化代理

  •  9
  • HelloSam  · 技术社区  · 14 年前

    假设我有一个父、子关系类和映射。我正在使用nhibernate从数据库中读取对象,并打算使用wcf将对象发送到线路上。

    目标

    • 为了读取父对象,我希望有选择地在不同的执行路径上决定何时加载子对象。因为我不想多读我需要的东西。
    • 那些部分加载的对象必须能够通过wcf发送。当我的意思是我不加载它时,任何一方都不会访问这样的属性。

    问题

    • 当通过wcf发送此类部分加载的对象时,这些属性标记为 [DataContract] 无法序列化,因为属性是惰性加载代理而不是真正的已知类型。

    我想要存档的内容或我能想到的解决方案

    • lazy=false lazy=true 不起作用。前者将急切地获取所有关系,后者将创建一个代理。但我什么也不想要-a null 会是最好的。
    • 我不需要偷懒。我希望得到一个 无效的 对于那些我不想得到的推荐信。一个空值,但不只是一个代理。这将使WCF高兴,并减少构建懒惰负载代理的时间。
      我可以有一个空代理工厂吗?
      -或
    • 或者让WCF忽略那些代理而不是真实的属性。我试过了 the IDataContractSurrogate solution ,但只有父级传递给 GetObjectToSerialize ,我从未观察到代理被传递 获取对象序列化 ,没有机会取消代理。

    编辑

    看完评论后,更多的人上网…

    在我看来,DTO将把计算的主要部分转移到服务器端。但是对于我正在进行的项目,50%的时间客户机比服务器更“智能”,服务器更像是带有验证和验证的数据存储。尽管我同意服务器并不完全是哑的,但我必须决定什么时候提取额外的引用,DTO会非常明确地说明这一点。

    也许我该忍受痛苦。我不知道 http://automapper.codeplex.com/ 以前,这会激励我更多地承受痛苦。

    另一方面,我发现 http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/ ,似乎与 IDataContractSurrogate.GetObjectToSerialize .

    2 回复  |  直到 13 年前
        1
  •  2
  •   Andrey S    13 年前

    在将DTO/Entities传输到WCF Silverlight时遇到同样的问题。我使用以下代码,效果良好:

    流利的氨气:

    References(c => c.DataSource)
        .Column("DataSourceId")
        .Cascade.None()
        .Not.LazyLoad();
    HasManyToMany(c => c.Categories)
        .Table("Categories")
        .ParentKeyColumn("ItemId")
        .ChildKeyColumn("CategoryId")
        .Not.LazyLoad()
        .Cascade.None()
        .Inverse();
    

    XML:

    <many-to-one name="DataSource" column="DataSourceId" lazy="false" cascade="none" />
    

    希望这对你有用!

        2
  •  1
  •   fatty    13 年前

    我在性能方面遇到了类似的问题,我所做的是通过使用 DetachedCriteria .

    就像你在做什么,我可能会做这样的事情。

    public DetachedCriteria BuildMyCriteria()
    {
        var criteria = DetachedCriteria.For<ParentClass>();
        criteria.CreateCriteria("this.ChildClass", "Child Class").SetFetchMode("this.ChildClass", FetchMode.Eager);
        criteria.Add(Restrictions.IsNotNull("ChildClass.Property");      
    
        return criteria;
    }
    

    然后从我的外观中,我将得到那些具有子属性上不具有空属性的属性的实体。

    var myClasses = _repository.ExecuteDetachedCriteria<ParentClass>(BuildMyCriteria);
    

    那么我将拥有所有具有空属性的ParentClass实体。

    因此,我不需要经常向数据库询问信息,而是将其存储在内存中,以便随时可以使用。

    这只是DTO的另一种解决方案,祝您好运:)