流畅的NHibernate - 如何在没有NHibernate的情况下插入子对象

时间:2013-08-21 13:22:59

标签: nhibernate fluent-nhibernate nhibernate-mapping

我正在使用Fluent NHibernate在数据库中插入父对象, 这个对象有一个子对象,这个子对象已经存在于数据库中,但我只有这个孩子的id。

如何使用外键(子)插入父对象,只将id设置为子对象?

示例:

ObjectParent parent = new ObjectParent();
ObjectChild child = new ObjectChild();

child.Id = 5; // 5 is the id from the child in the database
parent.Child = child;

Service.Create(parent); // here I need to insert the parent with the referenced foreign key (id = 5)

编辑:

我无法从数据库中获取子对象。

2 个答案:

答案 0 :(得分:1)

在NHibernate级别,您可以使用由ISession创建的代理。

如果您确定ID(例如5)存在,则可以致电session.Load<Child>(5)。这将为您返回proxy,实际上根本不需要加载。将该代理插入父代,只会为 Parent

发出INSERT语句
Create(Parent parent, int childId)// = 5)
{

  child = session.Load<Child>(5);

  parent.Child = child;

  session.Save(parent);

扩展:

如何处理引用的另一种方法可能是不同的映射。我通常将这两个属性用于Reference及其RefererenceId:

<property not-null="true" name="ChildId" insert="false" update="false" />
<many-to-one name="Child" column="ChildId" />

在您的情况下,解决方案将使用类似的解决方案,但具有可更新的ID proeprty

<property not-null="true" name="ChildId" />
<many-to-one name="Child" column="ChildId" insert="false" update="false" />

父母同时具有两种属性

class Parent 
{
    public virtual Child Child { get; set; }
    public virtual int ChildId { get; set; }

代码如

parent.ChildId = 5;

答案 1 :(得分:0)

使用stateless session,因为它不关心(子)实体之间的关系默认情况。它带来了真正的性能提升,请参阅my post中的示例。