NHibernate:多对一-*必须*加载父对象?

NHibernate:多对一-*必须*加载父对象?,nhibernate,loading,internals,object-persistence,Nhibernate,Loading,Internals,Object Persistence,假设以下实体类: public class Player { public virtual int ID { get; set; } public virtual string Name { get; set; } public virtual Team Team { get; set; } } public class Team { public virtual int ID { get; set; } public virtual string City { get; set;

假设以下实体类:

public class Player
{
 public virtual int ID { get; set; }
 public virtual string Name { get; set; }
 public virtual Team Team { get; set; }
}

public class Team
{
 public virtual int ID { get; set; }
 public virtual string City { get; set; }
 public virtual string Nickname { get; set; }
}
假设玩家使用以下映射类:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
 <class name="Player">
  <id name="ID" column="ID" type="System.Int32" unsaved-value="null">
   <generator class="native"/>
  </id>
  <property name="Name" column="Name" not-null="true" type="System.String"  length="50" insert="true" update="true"/>
  <many-to-one name="Team" not-null="true" outer-join="auto" insert="true" update="true">
   <column name="TeamID"/>
  </many-to-one>
 </class>
</hibernate-mapping>
我的问题:

当我想创建一个新玩家时,我必须加载一个成熟的团队(父对象)吗?
或者我可以指定一个“mock”对象,并且只指定外键

Player player = new Player
              {
               Name = "Tom Brady",
               Team = new TeamRepository().GetTeamByCityAndNickname("New England", "Patriots") // Is this the only way?
               // or can I do this?
               // Team = new Team { ID = 22 }
              };
new PlayerRepository().Add(player);

  • 如果我不能指定一个“mock” 对象(仅指定 外键),你能解释一下吗 为什么我不能
  • 也就是说,你能告诉我引擎盖下发生了什么吗

提醒一下:

  • 一个家伙已经死了
  • 给你

  • 有趣的是,说到英孚 4.0在一场比赛中,朱莉娅·勒曼 承认很多人想 在这些类型的应用程序中使用外键 情况

编辑:指向我问题的本质

把它想象成拥有一个 仅保留Id,并将加载 其余的,如果你需要的话。如果 你只是把它传给我 创建关系(如FKs),即 身份证是你所需要的一切

  • 如果是这样的话,那么为什么我需要担心代理对象之类的东西呢?为什么我不能创建一个“虚拟”对象并指定外键值呢

    • 您可以像这样使用外键

      Team = session.Load<Team>(id);
      
      Team=session.Load(id);
      

      了解

      如果此时您有权访问会话,您可以拨打

      Team = Session.Load<Team>(id);
      
      Team=Session.Load(id);
      

      Load的前提是它将创建一个NHibernate代理,如果需要,它可以自行解析。当然,您必须确保id存在,否则如果EntityNotFound试图自行解决问题,您将收到一个错误

      是的,我知道这是惯例,但我想知道这是否是唯一的办法;如果是这样,我想知道为什么。我以前回答过一个关于这个的问题。唯一的另一种选择是摆弄ID,这与NHibernate的最佳实践相违背,NHibernate的最佳实践建议ID应该是只读的。@Michael Gattuso:谢谢你告诉我。在我知道加载之前,我正在使用所谓的虚拟对象。它确实有效……但不建议这样做。你想知道为什么不建议?这是个好问题。@dotjoe:听起来我们在同一个阵营。:/只需说一句,我从未接受过正式的“NHibernate最佳实践”教育(可能是大多数人,如果不是所有人都属于这个阵营的话)。但不管怎样,我还是想打开这个黑盒子,了解一下推荐的最佳实践背后的“原因”。哈哈,我也不知道……我只是遵循了NHibernate网站上的那个疯狂初学者示例项目。然后我开始在某某网站上查看问题,并关注Ayende的博客。
      Team = Session.Load<Team>(id);