0

我正在使用 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)

编辑:

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

4

2 回答 2

1

在 NHibernate 级别上,您可以使用由ISession.

如果您可以确定 ID(例如 5)存在,您可以调用session.Load<Child>(5). 这将为proxy您返回一个,实际上根本不需要加载。将该代理插入到父级中,将仅为父级发出 INSERT 语句

Create(Parent parent, int childId)// = 5)
{

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

  parent.Child = child;

  session.Save(parent);

扩展:

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

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

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

<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;
于 2013-08-21T15:14:09.870 回答
0

使用无状态会话,因为默认情况下它不关心(子)实体之间的关系。它带来了真正的性能改进,请参阅我的帖子中的示例。

于 2013-08-21T16:07:35.510 回答