Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate:从存储库返回完全加载的实例的模式_Nhibernate_Design Patterns_Repository Pattern_Proxy Classes_Lazy Initialization - Fatal编程技术网

NHibernate:从存储库返回完全加载的实例的模式

NHibernate:从存储库返回完全加载的实例的模式,nhibernate,design-patterns,repository-pattern,proxy-classes,lazy-initialization,Nhibernate,Design Patterns,Repository Pattern,Proxy Classes,Lazy Initialization,作为我无尽的受NHibernate启发的DAL重构炼狱的一部分,我已经开始使用存储库模式使NHibernate与我的UI层保持距离。下面是一个从存储库加载方法的示例 public StoredWill Load(int id) { StoredWill storedWill; using (ISession session = NHibernateSessionFactory.OpenSession()) { storedWill = session.Load<Stor

作为我无尽的受NHibernate启发的DAL重构炼狱的一部分,我已经开始使用存储库模式使NHibernate与我的UI层保持距离。下面是一个从存储库加载方法的示例

public StoredWill Load(int id)
{
  StoredWill storedWill;
  using (ISession session = NHibernateSessionFactory.OpenSession())
  {
    storedWill = session.Load<StoredWill>(id);
  }
  return storedWill;
}
publicstoredwill-Load(int-id)
{
储存井储存井;
使用(ISession session=NHibernateSessionFactory.OpenSession())
{
storedWill=session.Load(id);
}
返回仓库;
}
我喜欢我的网站不知道ISession是什么

很自然,我开始出现惰性初始化异常,因为上面的方法不加载StoredWill,它只返回一个代理。当您访问代理的属性时,会出现异常,因为您在ISession范围内的时间更长。当我意识到发生了什么事时,我大笑起来

我已通过以下方式解决了此问题:

public StoredWill Load(int id)
{
  StoredWill storedWill;
  using (ISession session = NHibernateSessionFactory.OpenSession())
  {
    storedWill = session.Load<StoredWill>(id);
    string iReallyCouldntCareLess = storedWill.TestatorLastName;
  }
  return storedWill;
}
publicstoredwill-Load(int-id)
{
储存井储存井;
使用(ISession session=NHibernateSessionFactory.OpenSession())
{
storedWill=session.Load(id);
字符串IREALLYCOULDNTCALESS=storedWill.TestatorLastName;
}
返回仓库;
}
但这一切似乎有点愚蠢。有人使用稍微优雅一点的图案吗

我爱你们

David

查看;它有一个很好的抓取策略实现,非常适合这种任务。您可以阅读更多关于如何在上实现此功能的信息

我还应该注意到,您的会话使用有点不正常……您应该真正控制更高级别会话的生命周期(比如在控制器或httpmodule级别,具体取决于前端)。为每个存储库操作打开一个新会话是nhibernate世界的一个主要反模式;它有一个很好的抓取策略实现,非常适合这种任务。您可以阅读更多关于如何在上实现此功能的信息

public StoredWill Load(int id)
{
  StoredWill storedWill;
  using (ISession session = NHibernateSessionFactory.OpenSession())
  {
    storedWill = session.Load<StoredWill>(id);
    // force an eager load within the session
    NHibernateUtil.Initialize(storedWill.TestatorLastName);
  }
  return storedWill;
}
我还应该注意到,您的会话使用有点不正常……您应该真正控制更高级别会话的生命周期(比如在控制器或httpmodule级别,具体取决于前端)。为每个存储库操作打开一个新会话是nhibernate世界中一个主要的反模式。

public-StoredWill-Load(int-id)
public StoredWill Load(int id)
{
  StoredWill storedWill;
  using (ISession session = NHibernateSessionFactory.OpenSession())
  {
    storedWill = session.Load<StoredWill>(id);
    // force an eager load within the session
    NHibernateUtil.Initialize(storedWill.TestatorLastName);
  }
  return storedWill;
}
{ 储存井储存井; 使用(ISession session=NHibernateSessionFactory.OpenSession()) { storedWill=session.Load(id); //强制在会话中加载渴望的内容 初始化(storedWill.TestatorLastName); } 返回仓库; }
公共存储的文件加载(int id)
{
储存井储存井;
使用(ISession session=NHibernateSessionFactory.OpenSession())
{
storedWill=session.Load(id);
//强制在会话中加载渴望的内容
初始化(storedWill.TestatorLastName);
}
返回仓库;
}

使用依赖项注入,并通过其构造函数将ISession传递给存储库类。这是允许多个存储库参与同一事务的唯一方法


你的网站应该对ISession有一些了解,因为ISession是定义交易边界的地方。您可以使用session per request模式,以便ISession仅在HttpRequest模块或Global.asax中引用。或者您可以使用框架或包含NHibernate并控制页面上的事务。

使用依赖项注入并通过其构造函数将ISession传递给存储库类。这是允许多个存储库参与同一事务的唯一方法


你的网站应该对ISession有一些了解,因为ISession是定义交易边界的地方。您可以使用session per request模式,以便ISession仅在HttpRequest模块或Global.asax中引用。或者,您可以使用框架或采用NHibernate并控制页面上的事务。

部分问题在于您使用的是会话.Load()而不是会话.Get()

参见本文作者 对于这两个方面的深入描述

调用Session.Load()时,您告诉nhibernate创建一个具有您提供的Id的代理对象。执行此操作时,nhibernate实际上不会调用数据库来检索数据。这意味着,如果您使用数据库中不存在的内容Session.Load(),它将抛出异常。由于您在访问对象之前关闭了会话,因此无法访问数据,因为代理会话现在已关闭

一个简单的修复方法是将代码更改为使用Session.Get()。这将从数据库中加载StoredWill类,并用对象所需的数据填充对象。但是请注意,如果对象中有任何内部类或集合,它只会为这些类或集合创建代理。如果您需要一次性获得所有信息,您可以使用多种查询机制中的一种来加载所需的部件或使用投影


我希望这是有意义的:)

部分问题在于您使用的是会话.Load()而不是会话.Get()

参见本文作者 对于这两个方面的深入描述

调用Session.Load()时,您告诉nhibernate创建一个具有您提供的Id的代理对象。执行此操作时,nhibernate实际上不会调用数据库来检索数据。这意味着,如果您使用数据库中不存在的内容Session.Load(),它将抛出异常。由于您在访问对象之前关闭了会话,因此无法访问数据,因为代理会话现在已关闭

一个简单的修复方法是将代码更改为使用Session.Get()。这将从数据库中加载StoredWill类,并用它需要的数据填充对象