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);