代码之家  ›  专栏  ›  技术社区  ›  Tommy Jakobsen

NHibernate:“延迟初始化失败…”,DDD方法

  •  2
  • Tommy Jakobsen  · 技术社区  · 15 年前

    基础结构层: 包含映射文件、存储库实现和用于配置和构建会话工厂的NHibernate引导程序。

    下面是一个存储库示例:

    public class CustomerRepository : ICustomerRepository
    {
        public Customer GetCustomerById(int customerId)
        {
            using (var session = NHibernateBootstrapper.OpenSession())
                return session.Get<Customer>(customerId);
        }
    }
    

    域层: 具有简单的POCO类、存储库和服务接口

    包含服务实现。

    下面是一个服务示例:

    public class CustomerService : ICustomerService
    {
        private ICustomerRepository _repository;
    
        public CustomerService(ICustomerRepository repository)
        {
            _repository = repository;
        }
    
        public Customer GetCustomerById(int customerId)
        {
            return _repository.GetCustomerById(customerId);
        }
    }
    

    表示层: 包含ASP.NET MVC应用程序。这就是我发现问题的地方。 使用MVC方法,我有一个控制器,它使用CustomerService服务获取客户并在视图中显示客户(强类型)。此客户有一个相关的实体联系人,当我尝试使用Model.Contact在视图中访问它时,其中Model是我的客户对象,我得到一个LazyInitializationException。

    我知道我为什么会得到这个。这是因为用于在CustomerRepository中检索客户的会话现在已停止。我的问题是如何解决这个问题。我希望能够避免在我的存储库中获取客户的相关联系人实体,因为某些视图只需要客户数据,而不需要联系人数据。如果可能的话?

    那么问题是:在表示层需要相关实体联系之前,是否可以等待查询数据库?

    article 描写。我只是不知道如何在基础架构层实现它,或者应该在哪里实现它?

    提前谢谢。任何帮助都将不胜感激!

    3 回复  |  直到 15 年前
        1
  •  2
  •   Sly    15 年前

    对于会话管理,通常每个请求使用单个会话。您可以看到一个实现示例 here . 这是一个开源项目,旨在在Nhibernate wery easy的帮助下安装新的asp.net应用程序。可以创建源代码 here

    希望能有帮助。

        2
  •  1
  •   Community CDub    8 年前

    您将遇到的另一个问题是在会话中存储实体。一旦您尝试从会话[“Customer”]中获取客户,您将得到相同的异常。有几种解决方案可以解决这个问题,例如存储ID,或者添加存储库方法以防止延迟加载要存储在会话中的对象—读取NHibernate的SetFetchMode—当然,您也可以使用它将实体传递给视图。但正如我所说,您最好坚持使用ViewModel方法。谷歌的ViewModel,或参考《行动手册》中的ASP.NETMVC,其中使用了 http://code.google.com/p/codecampserver/ . 也读 this

        3
  •  0
  •   cdmckay    15 年前

    virtual ?

    你是如何开始和结束你的课程的?我使用 ActionFilterAttribute 打电话 TransactionPerRequest 用它装饰我所有的控制器。

    退房 this