【问题标题】:Issues in WCF Service with NHibernateNHibernate 的 WCF 服务中的问题
【发布时间】:2013-02-06 17:13:03
【问题描述】:

我正在尝试使用 Fluent NHibernate 和 WCF 创建一个服务层。如何使用 LazyLoad?例如,我会得到一些对象。该对象包含一个用 LazyLoad 映射的集合。所以,我的服务方法创建一个会话,检索对象并关闭会话。懒惰的收集呢?我的服务调用者不会访问数据,因为我没有打开的会话。如何治疗?

谢谢各位!!

【问题讨论】:

  • 这个项目是否以某种方式涉及 UI 组件(WPF 或 Silverlight 应用程序)?还是这只是一个服务器项目?
  • 只是一个服务器。我的目标是将我所有的数据库行为集中到一个服务中,我的所有应用都可以访问它。

标签: c# wcf nhibernate


【解决方案1】:

只有在连接到数据库的情况下,才能对 NHibernate 使用延迟加载。

如果您想坚持使用 NHibernate 并通过 WCF 访问您的数据,则需要切换到预加载。

如果你愿意放弃 WCF,你可以让你的客户直接访问数据库。

如果您愿意放弃 Nhiberhate,您可以使用 WCF 数据服务。

【讨论】:

    【解决方案2】:

    会发生延迟加载,但它会在您的返回值被序列化为 WCF 响应时发生。例如,我们有这些类:

    [DataContract]
    public class Person
    {
        [DataMember]
        public virtual string Name { get; set; }
    
        [DataMember]
        public virtual Address Address { get; set; }
    }
    
    [DataContract]
    public class Address
    {
    }
    

    假设Person.Address 是懒惰的。您查询一个人,而不加载他的地址,并希望将此对象返回给客户端。

    输入 WCF。 WCF 会序列化所有的[DataMember]s,Address 就是其中之一。因此将调用 getter,如果您仍在 using (ISession) 范围内,它将执行延迟加载。如果您没有使用 using 范围而只是定义了一个变量 ISession(您可能不会关闭),那么惰性查询也会执行。

    【讨论】:

    • 即使我关闭了我用来获取对象的会话,当我调用惰性属性时,也会发生惰性?
    • 不,如果惰性对象未附加到打开的会话,则无法获取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2011-11-08
    相关资源
    最近更新 更多