2013-08-21 61 views
0

我使用Fluent NHibernate插入一個父對象到數據庫中, 這個對象有一個子對象,並且這個子對象已經存在於數據庫中,但是我只是有這個孩子的ID。Fluent NHibernate - 如何插入一個子對象而不通過NHibernate

我怎樣才能插入父對象與他的外鍵(子)只有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) 

編輯:

我不能從數據庫中獲取的子對象。

回答

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

擴展:

另一種方式如何處理引用,可能是不同的映射。我通常使用的參考這兩個屬性及其RefererenceId:

<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; 
代碼
+0

我無法從數據庫中獲取子項。 –

+0

我爲您提供了另一種方法。這將對您有用,您將需要更改您的映射並在Parent上引入ChildId屬性 –

0

使用stateless session,因爲它默認不關心(子)實體之間的關係。它帶來了真正的性能提升,請參閱my post中的示例。