【问题标题】:Setting a relation without fetching the object with NHibernate设置关系而不使用 NHibernate 获取对象
【发布时间】:2012-03-13 11:25:22
【问题描述】:

我有两个实体类:PersonPosition

public class Person
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
  public virtual Position Position { get; set; }
}

public class Position
{
  public virtual int Id { get; set; }
  public virtual string Code { get; set; }
}

PersonPosition 具有一对多关系。我还有一个 DTO PersonDto,它可以从客户端获取人员数据。

public class PersonDto
{
  public string Name { get; set; }
  public int PositionId { get; set; }
}

获得 DTO 后,我必须创建一个新的 Person 对象并将其持久化。通常它看起来像这样:

var person = new Person();
CopyFromDto(person, personDto);
var position = positionRepository.GetById(personDto.PositionId);
person.Position = position;
personRepository.Save(person);

我想知道我是否可以摆脱这条线:

var position = positionRepository.GetById(personDto.PositionId);

原因是它产生了一个不必要的 SQL 查询来获取一些位置数据。是否有可能以某种方式为 NHibernate 提供位置 ID 并用它保存一个人行?

提前致谢。

【问题讨论】:

    标签: c# nhibernate dto


    【解决方案1】:

    使用ISession.Load

    ISession 的 Load() 方法为您提供了一种检索持久性数据的方法 实例,如果你已经知道它的标识符。

    注意 Load() 将抛出一个不可恢复的异常,如果没有 匹配的数据库行。如果该类使用代理进行映射,则 Load() 返回一个对象,它是一个未初始化的代理,实际上并没有 访问数据库,直到您调用对象的方法。这 如果您希望创建与 对象而不实际从数据库中加载它。

    https://nhibernate.info/doc/nh/en/index.html#manipulatingdata-loading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2011-12-09
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      相关资源
      最近更新 更多